找回密码
 立即注册
查看: 1396|回复: 10

FREERTOS中断里切换任务

[复制链接]

该用户从未签到

19

主题

517

回帖

1632

积分

荣誉版主

积分
1632
发表于 2023-1-2 13:28:15 | 显示全部楼层 |阅读模式
请问有没有人知道 STC官方移植的FREERTOS (版本号是:V1.0.2)  ,在中断里怎么切换任务? 用哪个函数?  我试过在中断里调用taskYIELD(); 但跟踪时发现没退出中断就直接切换到任务中去了, 这个逻辑是不对的
回复 送花

使用道具 举报

该用户从未签到

45

主题

2910

回帖

6540

积分

超级版主

积分
6540
发表于 2023-1-2 15:55:19 | 显示全部楼层
RTOS是有自己的一套逻辑要求的。不要在中断中切换任务。在主程序中建立任务,运行、切换任务,OS内核也会在节拍中断时隙里切换任务(占先切换)。

该用户从未签到

19

主题

517

回帖

1632

积分

荣誉版主

积分
1632
 楼主| 发表于 2023-1-2 16:16:43 | 显示全部楼层
梁工 发表于 2023-1-2 15:55
RTOS是有自己的一套逻辑要求的。不要在中断中切换任务。在主程序中建立任务,运行、切换任务,OS内核也会在 ...

谢谢您的回复,内核是会在每次节拍的时候切换任务,但是如果我在别的中断中,激活了一个高优先级的任务(比如说xSemaphoreGiveFromISR( xBinarySemaphore, &xHigherPriorityTaskWoken );然后跟据igherPriorityTaskWoken的值来确定是否要进行任务切换,), 但是,在这里,如果我要切换任务, 却不知道应该怎么操作了,是调哪个函数呢?这是我的疑问.如果这里给了信号量,却没有主动切换任务, 就像您刚才说的那样, 只能等到时钟节拍时才能自动切换任务了, 但是这样并不实时,我想应该有一种方法可以退出中断以后马上做切换任务的动作

点评

zhp
您好,关于您提出的问题,我提供一点个人的理解供您参考 FreeRTOS中提供的任务切换只有两种方式:抢占式和时间片轮询式 时间片轮询式:任务的切换会在主循环中的IDLE进程中进行切换,在当前任务放弃CPU控制权之前,  详情 回复 发表于 2023-1-3 10:40
  • TA的每日心情
    开心
    2024-1-4 08:56
  • 签到天数: 14 天

    [LV.3]偶尔看看II

    16

    主题

    711

    回帖

    2520

    积分

    超级版主

    积分
    2520
    发表于 2023-1-3 10:40:46 | 显示全部楼层
    tzz1983 发表于 2023-1-2 16:16
    谢谢您的回复,内核是会在每次节拍的时候切换任务,但是如果我在别的中断中,激活了一个高优先级的任务(比如 ...

    您好,关于您提出的问题,我提供一点个人的理解供您参考

    FreeRTOS中提供的任务切换只有两种方式:抢占式和时间片轮询式
    时间片轮询式:任务的切换会在主循环中的IDLE进程中进行切换,在当前任务放弃CPU控制权之前,其它任何高优先级的进程都无法抢占CPU
    抢占式:每个时间片结束后,在节拍中断中选择优先级最高的任务进行切换,注意此时的任务是在中断中直接切换的,就像您所说中断没退出就切换到任务中去了

    若要在其它中断中切换切换任务不能直接调用vPortYield或者taskYIELD,堆栈会乱掉。
    如果您确实要在其它非节拍中断中强行切换任务,可参考范例中的vTimer0ISR中的代码

    该用户从未签到

    550

    主题

    9221

    回帖

    1万

    积分

    管理员

    积分
    13914
    发表于 2023-1-3 10:59:01 | 显示全部楼层
    中肯,必读
    回复 送花

    使用道具 举报

  • TA的每日心情
    擦汗
    前天 00:35
  • 签到天数: 119 天

    [LV.6]常住居民II

    1

    主题

    106

    回帖

    1821

    积分

    金牌会员

    积分
    1821
    发表于 2023-1-3 11:10:29 | 显示全部楼层
    这个我需要好好学

    该用户从未签到

    550

    主题

    9221

    回帖

    1万

    积分

    管理员

    积分
    13914
    发表于 2023-1-3 11:26:55 | 显示全部楼层
    基本的会了,有时间的一定 要把这个 FreeRTOS + STC32G12K128  认真摸一摸,学 数据结构,软件编程思想的最佳 入门手段

    该用户从未签到

    19

    主题

    517

    回帖

    1632

    积分

    荣誉版主

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

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

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

    使用道具 举报

    该用户从未签到

    19

    主题

    517

    回帖

    1632

    积分

    荣誉版主

    积分
    1632
     楼主| 发表于 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
    目前程序在各项测试还算稳定, 打算做一个简单的模板,以后就可以直接用来上项目了

    该用户从未签到

    550

    主题

    9221

    回帖

    1万

    积分

    管理员

    积分
    13914
    发表于 2023-1-3 16:05:30 | 显示全部楼层
    感谢分享 点点滴滴的经验,共同建设好我们 32位8051社区的 FreeRTOS 版块!
    涓涓细流,终成江河,32位 8051 的 FreeRTOS 时代,必将到来
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-4-27 10:02 , Processed in 0.070770 second(s), 66 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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