tzz1983 发表于 2024-3-26 20:30:16

本帖最后由 tzz1983 于 2024-3-26 20:31 编辑

gentleman 发表于 2024-3-26 19:51
辛苦兄弟了
你的这个勾子是不是还没有实际连接函数? 不过没关系,我看懂了.

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

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

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

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

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


gentleman 发表于 2024-3-26 21:07:35

tzz1983 发表于 2024-3-26 20:30
你的这个勾子是不是还没有实际连接函数? 不过没关系,我看懂了.

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


谢谢兄弟了{:4_197:}



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








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

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


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


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



tzz1983 发表于 2024-3-26 21:36:35

本帖最后由 tzz1983 于 2024-3-26 21:46 编辑

gentleman 发表于 2024-3-26 21:07
谢谢兄弟了



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

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

杨为民 发表于 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 发表于 2024-3-26 21:58:54

tzz1983 发表于 2024-3-26 21:36
好的,我再说简单一点吧,

现在有 三个中断 A B C


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

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

tzz1983 发表于 2024-3-26 21:59:20

杨为民 发表于 2024-3-26 21:53
1. 对于STC单片机RTOS,关闭总中断, 采用什么技术才能保证OS 切换任务能正常运行?
答: 采用定时器 0 (模 ...
杨老师,现在 gentleman 计划用 OSIntNesting 来玩 FreeRTOS, 把FreeRTOS玩成了uC/OS的味道{:lol:},这可是您的强项啊,接下来好好辅导一下.

tzz1983 发表于 2024-3-26 22:01:59

本帖最后由 tzz1983 于 2024-3-26 22:03 编辑

gentleman 发表于 2024-3-26 21:58
应该这样吧先忽略丢tick 的bug

ABC 中断依次进入

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


gentleman 发表于 2024-3-26 22:07:18

tzz1983 发表于 2024-3-26 22:01
你这样不是又走了官网那个例子的老路了吗,推到下一个时钟,即然如果,那还改什么.
杨老师发表一下意见
...

的确是那条路

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

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

tzz1983 发表于 2024-3-26 22:08:23

gentleman 发表于 2024-3-26 21:58
应该这样吧先忽略丢tick 的bug

ABC 中断依次进入


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

杨为民 发表于 2024-3-26 22:13:06

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

现在是实验课,同学交流时间
页: 1 2 3 4 5 6 7 8 [9] 10 11 12 13 14 15 16 17 18
查看完整版本: 【全部暂停】【方向改为完善官方的FreeRTOS】 随时关EA的 FreeRT