找回密码
 立即注册
楼主: tzz***

FREERTOS中断里切换任务

[复制链接]

该用户从未签到

19

主题

514

回帖

1622

积分

荣誉版主

积分
1622
 楼主| 发表于 2023-1-3 14:58:00 | 显示全部楼层
zhp 发表于 2023-1-3 10:40
您好,关于您提出的问题,我提供一点个人的理解供您参考

FreeRTOS中提供的任务切换只有两种方式:抢占式 ...

谢谢大家的关心,这个问题现在我已经解决了,其实UCOS2的代码我还是认真读过的, 都能理解,但出于时间的关系,现在不想用太多的时间去研究FREE的原码.
    我在这里也把我是怎么解决这个问题的思路说一下,就当是交流经验,大神路过就不要喷,
我就是把切换任务的工作从Timer0中断里剃除出来,Timer0做时钟滴功能,不直接做任务切换,需要切换时激活另一个中断. 直正的任务切换放在了另一个中断里, 这个中断就是专门用来切换任务的,比如我现在借用了Timer4的中断, 把他的优先级设为最低, 这样就有点像M3的PendSV.如此一来, 不管是任务,还是别的中断, 都可以用他做任务切换.因为在需要做任务切换时,只要设一个中断标志,真正的任务切换是触发中断后在中断里进行的.
对于STC的原程序,我还有了另个几个地方的修改
1:原文中为了使用统一的任务返回方式( ERET), 在中断里改了堆的数据,这里我又改回了,直接用RETI返回,这样提高了效率,不用来回倒腾数据, 但是相对应的xPortStartScheduler()函数也要更改,因为这个函数不能用RETI做返因指令,( 这个函数只在启动时用一次)
2:直接删除了vPortYield()函数, 改用一个宏替代 #define  vPortYield()() T4IF=1
目前程序在各项测试还算稳定, 打算做一个简单的模板,以后就可以直接用来上项目了

该用户从未签到

547

主题

9134

回帖

1万

积分

管理员

积分
14057
发表于 2023-1-3 16:05:30 | 显示全部楼层
感谢分享 点点滴滴的经验,共同建设好我们 32位8051社区的 FreeRTOS 版块!
涓涓细流,终成江河,32位 8051 的 FreeRTOS 时代,必将到来
  • TA的每日心情
    奋斗
    2024-4-11 07:55
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    0

    主题

    9

    回帖

    676

    积分

    高级会员

    积分
    676
    发表于 2023-3-15 10:52:58 | 显示全部楼层
    学习了,谢谢
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-4-20 21:31 , Processed in 0.065110 second(s), 35 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表