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

【全部暂停】【方向改为完善官方的FreeRTOS】 随时关EA的 FreeRT

[复制链接]

该用户从未签到

20

主题

573

回帖

1183

积分

荣誉版主

积分
1183
发表于 2024-3-26 20:30:16 | 显示全部楼层
本帖最后由 tzz1983 于 2024-3-26 20:31 编辑

你的这个勾子是不是还没有实际连接函数? 不过没关系,我看懂了.

这个 ISR_Package_CODE(n) 里面的代码还是相差的太多了

我把主要意思一次说一下,代码就靠你自己的揣摩了.

刚才回LAOXU的内容也适合你,"如果是嵌套,正确的操作是返回到之前的那个中断,切换任务将由最后一个将要退出的中断来完成。
因为中断是随机的,由此可推断出,其实是每个中断都要检查是否要切换任务(包括是否有比自己优先级高的嵌套中断提交了切换任务请求)
见这代码:
    if( xTaskIncrementTick() != pdFALSE )    {
        portEND_SWITCHING_ISR();
    }
xTaskIncrementTick() 是有返回值的,这个值代表着是否有更高优先的级任务就绪,如果当时不能切换,就要把这个值传递下去...直到 OSIntNesting==0时,
在嵌套中断链上,如果曾经有中断提出过请求,就要切换任务.否则会丢失一次切换.
这里只是举例,不只是xTaskIncrementTick() ,还有很多OS服务会使新的任务就绪.
uC/OS是用 OSIntExit(); 函数来检索是否需要切换,Free 我不知道除了值传递,还有哪些更好的检查方法,
总之就是每个中断都要检查是否要切换.

之前也说过,用这个方法去解决很麻烦,其实麻烦的还不止是这个,这些都是只要把代码写完了,也就没事了. 

关键是用户体验呀,你现在计划用勾子,也就是改变了用户的习惯使用方式.
但是你如果不用勾子,就得告诉用户,进中断第一件事就是OSIntNesting++, 退出中断时也别忘记调用我给你编好的 xxxx()函数来退出中断!


点评

谢谢兄弟了 钩子函数 实现了的 都在ISR文件夹里 [attachimg]39712[/attachimg] 我最初的想法 是这样 T0 虽然是优先级最高 但只要 T0 在有其他中断时(判断计数器>0)啥都不干 直接返回 那它其实就是 优  详情 回复 发表于 2024-3-26 21:07
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
     楼主| 发表于 2024-3-26 21:07:35 | 显示全部楼层
    tzz1983 发表于 2024-3-26 20:30
    你的这个勾子是不是还没有实际连接函数? 不过没关系,我看懂了.

    这个 ISR_Package_CODE(n) 里面的代 ...


    谢谢兄弟了



    钩子函数 实现了的 都在ISR文件夹里





    截图202403262049037613.jpg



    我最初的想法 是这样
    T0 虽然是优先级最高
    但只要 T0 在有其他中断时(判断计数器>0)啥都不干 直接返回
    那它其实就是 优先级最低

    其他一切同官方移植的系统一样,任务也只会在T0里切换,其他中断也不考虑任务切换的问题,这样os就能正常跑起来


    那么首要的问题,兄弟一针见血的指出来了
    那就是丢tick


    其他的内容,我再理解理解
    ============================
    用户体验这个的确解决不了,用户只能向使用库函数一样,使用ISR 文件夹下的 中断函数



    点评

    好的,我再说简单一点吧, 现在有 三个中断 中断A最先触发 接着中断B触发,嵌套了,B打断了A 再接着中断C触发,又嵌套了,C打断了B 在中断C里调用了一个OS服务,使任务X就绪了,但是由于中断嵌套中,不能现在马  详情 回复 发表于 2024-3-26 21:36
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    573

    回帖

    1183

    积分

    荣誉版主

    积分
    1183
    发表于 2024-3-26 21:36:35 | 显示全部楼层
    本帖最后由 tzz1983 于 2024-3-26 21:46 编辑

    好的,我再说简单一点吧,

    现在有 三个中断 A B C

    首先中断A最先触发
    接着中断B触发,嵌套了,B打断了A
    再接着中断C触发,又嵌套了,C打断了B
    在中断A里调用了一个OS服务,使任务X就绪了(假设X的任务优先级最高),但是由于中断嵌套中,不能现在马上切换任务,运行完后RETI 至任务B
    B也不能切换任务,只能返回C
    到C了,C检查到 OSIntNesting==0,接下来还要检查A+B+C是否更新了就绪表.
    很明显,A更新了就绪表,所以C要进行任务切换.(在这里,C没有使任务就绪,但嵌套链上端的A有,此时由C代替A做任务切换)

    这个看懂了吗? 

    即然C要检查是否有新的任务就绪,中断又是随机了, 谁也保不准最后一个退出中断的是哪个中断. 即可推断出->所有的中断在退出前都要检查是否要切换任务

    点评

    仔细想了这个例子 感觉C 后切换任务x还是不对 FreeROTS中 中断级 > 任务级 任务切换不在T0 也得再 最低级的A 退出后 切换 新的想法是 在 嵌套计数器--; 或中断退出后; if 中断计数器 == 0 进行任务切换  详情 回复 发表于 2024-3-27 07:28
    应该这样吧 先忽略丢tick 的bug ABC 中断依次进入 中断处理结束 CBA 顺序退出 任务X 再A退出的 下个T0中断内 切换  详情 回复 发表于 2024-3-26 21:58
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10900
    发表于 2024-3-26 21:53:54 | 显示全部楼层
    LAOXU 发表于 2024-3-26 18:21
    1. 对于STC单片机RTOS,关闭总中断, 采用什么技术才能保证OS 切换任务能正常运行?
    答: 采用定时器 0 (模式 ...

    1. 对于STC单片机RTOS,关闭总中断, 采用什么技术才能保证OS 切换任务能正常运行?
    答: 采用定时器 0 (模式 3) , 才能保证 关闭总中断, OS 切换任务能正常运行.

    2. 对于STC单片机RTOS,采用什么技术才能保证OS 切换任务的实时性, 越快越好?
    答: 采用定时器 0 (模式 3)  直接切换, 才能保证OS 切换任务的实时性, 最快.



    ===============================================================================
    点评:如果满分是100分,这个答案可得150分。50分的加分是因为这个答案是结合STC单片机实际,用逻辑推理得出的。


    1. 对于STC单片机RTOS,关闭总中断, 采用什么技术才能保证OS 切换任务能正常运行?

    分析:对于STC单片机,目前关闭总中断后,唯一能够正常产生定时中断的只有采用定时器 0 (模式 3) ,
    所以逻辑上说采用定时器 0 (模式 3) , 才能保证 关闭总中断, OS 切换任务能正常运行.


    2. 对于STC单片机RTOS,采用什么技术才能保证OS 切换任务的实时性, 越快越好?

    分析:假如切换任务的3个步骤的程序已经定下来了,那么如果再通过其他代码来间接调用这些程序,运行这些其他代码必然就要增加时间开销。
    所以逻辑上说直接切换, 才能保证OS 切换任务的实时性, 最快.




    3.对于STC单片机RTOS,关闭总中断, 采用什么技术才能保证OS 切换任务能正常运行,同时,采用什么技术才能保证OS 切换任务的实时性, 越快越好?
    答: 采用定时器 0 (模式 3) 直接切换, 才能保证OS 切换任务的实时性, 最快.

    分析:因为答案1和答案2不冲突,
    逻辑上说所以将它们结合起来就是既这个又那个的唯一答案


    因此对于STC单片机RTOS,采用定时器 0 (模式 3)  和直接切换任务, 既能保证 关闭总中断, OS 切换任务能正常运行,又能保证OS 切换任务的实时性, 最快!
    这就是STC8H和STC32G/F系列单片机上的RTOS同时满足两个题目要求的唯一正确答案,这个答案由LAOXU给出了。


    点评

    杨老师,现在 gentleman 计划用 OSIntNesting 来玩 FreeRTOS, 把FreeRTOS玩成了uC/OS的味道,这可是您的强项啊,接下来好好辅导一下.  详情 回复 发表于 2024-3-26 21:59
    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
     楼主| 发表于 2024-3-26 21:58:54 | 显示全部楼层
    tzz1983 发表于 2024-3-26 21:36
    好的,我再说简单一点吧,

    现在有 三个中断 A B C

    应该这样吧  先忽略丢tick 的bug

    ABC 中断依次进入
    中断处理结束  CBA 顺序退出
    任务X 再A退出的 下个T0中断内 切换

    点评

    (1)你直接学习tzz1983的招数(见我34楼的介绍),抄袭他的答案,他现在是忽悠你的,他自己已经解决了 (2)答案极其简单:在每个中断都规范地加上“退出中断任务切换函数”。这样不管嵌套多少层,多少次,后面嵌  详情 回复 发表于 2024-3-26 22:48
    再举一例,A中断,被滴答打断,滴答不切,A也不切,再等一次,直到滴答不嵌套再切吧,反正我也不急,是这样的吧  详情 回复 发表于 2024-3-26 22:08
    你这样不是又走了官网那个例子的老路了吗,推到下一个时钟,即然如果,那还改什么. 杨老师发表一下意见  详情 回复 发表于 2024-3-26 22:01
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    573

    回帖

    1183

    积分

    荣誉版主

    积分
    1183
    发表于 2024-3-26 21:59:20 | 显示全部楼层
    杨为民 发表于 2024-3-26 21:53
    1. 对于STC单片机RTOS,关闭总中断, 采用什么技术才能保证OS 切换任务能正常运行?
    答: 采用定时器 0 (模 ...

    杨老师,现在 gentleman 计划用 OSIntNesting 来玩 FreeRTOS, 把FreeRTOS玩成了uC/OS的味道,这可是您的强项啊,接下来好好辅导一下.
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    573

    回帖

    1183

    积分

    荣誉版主

    积分
    1183
    发表于 2024-3-26 22:01:59 | 显示全部楼层
    本帖最后由 tzz1983 于 2024-3-26 22:03 编辑
    gentleman 发表于 2024-3-26 21:58
    应该这样吧  先忽略丢tick 的bug

    ABC 中断依次进入

    你这样不是又走了官网那个例子的老路了吗,推到下一个时钟,即然如此,那还改什么.
    不过你要是觉得只要可以运行就可以的话,这样也行. 只是得取消"实时"二字
    杨老师发表一下意见


    点评

    现在是实验课,同学交流时间  详情 回复 发表于 2024-3-26 22:13
    的确是那条路 因为我上个版本存在 嵌套中断的bug,要修的啊 修好bug 再走下一步 兄弟想说啥就 留言吧,其他老师指点也是,我先去睡觉了,明天早早起来看  详情 回复 发表于 2024-3-26 22:07
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    2024-5-5 08:35
  • 签到天数: 143 天

    [LV.7]常住居民III

    29

    主题

    558

    回帖

    2138

    积分

    荣誉版主

    积分
    2138
     楼主| 发表于 2024-3-26 22:07:18 | 显示全部楼层
    tzz1983 发表于 2024-3-26 22:01
    你这样不是又走了官网那个例子的老路了吗,推到下一个时钟,即然如果,那还改什么.
    杨老师发表一下意见
    ...

    的确是那条路

    因为我上个版本存在 嵌套中断的bug,要修的啊
    修好bug 再走下一步

    兄弟想说啥就 留言吧,其他老师指点也是,我先去睡觉了,明天早早起来看

    点评

    去睡吧  发表于 2024-3-26 22:09
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    573

    回帖

    1183

    积分

    荣誉版主

    积分
    1183
    发表于 2024-3-26 22:08:23 | 显示全部楼层
    gentleman 发表于 2024-3-26 21:58
    应该这样吧  先忽略丢tick 的bug

    ABC 中断依次进入

    再举一例,A中断,被滴答打断,滴答不切,A也不切,再等一次,直到滴答不嵌套再切吧,反正我也不急,是这样的吧
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10900
    发表于 2024-3-26 22:13:06 | 显示全部楼层
    tzz1983 发表于 2024-3-26 22:01
    你这样不是又走了官网那个例子的老路了吗,推到下一个时钟,即然如此,那还改什么.
    不过你要是觉得只要可 ...

    现在是实验课,同学交流时间
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

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

    GMT+8, 2024-5-16 02:09 , Processed in 0.071798 second(s), 67 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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