杨为民 发表于 2024-3-26 22:48:10

本帖最后由 杨为民 于 2024-3-26 22:52 编辑

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

ABC 中断依次进入

(1)你直接学习tzz1983的招数(见我34楼的介绍),抄袭他的答案,他现在是忽悠你的,他自己已经解决了

(2)答案极其简单:在每个中断都规范地加上“退出中断任务切换函数”。这样不管嵌套多少层,多少次,后面嵌套进来的中断,(优先级都比第一次中断高才会嵌套进来的),在退出中断任务切换函数中就会检测的嵌套计数大于1,就会什么事都不做退出。
等退出嵌套又到了第一层中断时,这时已经没有中断嵌套了,自然退出中断任务切换函数就会正确地进行任务切换了。
(3)当初STC的FreeRTOS把系统节拍放在定时器0中断是对的,理由见LAOXU的答案,其次如果定时器0工作在不可屏蔽中断模式再加上是中断最高优先级,
试问其他那个中断能够打断它?谁都不能打断系统节拍中断,又怎么会“丢TICK”呢?

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

本帖最后由 tzz1983 于 2024-3-26 23:14 编辑

杨为民 发表于 2024-3-26 22:48
(1)你直接学习tzz1983的招数(见我34楼的介绍),抄袭他的答案,他现在是忽悠你的,他自己已经解决了

...
杨老师,我冤枉呀,我没有忽悠他,这种事情我才做不出来呢{:lol:}
我是让他每个中断退出前都检查呀,OSIntExit()都拿出来举例了,只是他急于交卷,不乐意去做呀.

其实呢,如果是作为学生交卷,可以给及格了.

但从逻辑上来讲,是不合格的,他这样做..
假设有个中断和滴答同步,永远在滴答中断前面一点触发(最坏的情况,是可能发生的)
滴答因为嵌套不能切换,其它中断又不乐意切换,结果就...没有结果了


丢TICK是您没看仔细,他前面代码直接RETI了

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

tzz1983 发表于 2024-3-26 22:59
杨老师,我冤枉呀,我没有忽悠他,这种事情我才做不出来呢
我是让他每个中断退出前都检查呀,OSIntExit() ...
(1)“丢TICK是您没看仔细,他前面代码直接RETI了”

STC FreeRTOS的移植部分的代码每一行我都看了,没有问题。
(2)至于本帖主修改在1楼的程序,我没有必要看。因为如果作为LAOXU题目的考卷,0分。LAOXU没打分是手下留情,我点赞他是因为他的勇气:不耻下问

李皇谛 发表于 2024-3-26 23:53:47

本帖最后由 李皇谛 于 2024-3-26 23:55 编辑

soma 发表于 2024-3-25 11:38
关中断定时器0还会工作就这意思吗
定时器0工作在模式3的时候,开ET0中断就会直接将T0升格到NMI(Non-Maskable Interrupt)中断。
NMI中断就是“不可屏蔽中断”(ARM或者STM32的说明文档也说了),升级到NMI中断之后,哪怕你关了EA和ET0都会导致定时器0中断继续挂号,直到单片机复位。
想要让定时器0不再影响NMI中断,只能将定时器停止。

LAOXU 发表于 2024-3-27 06:13:05

杨为民 发表于 2024-3-26 23:26
(1)“丢TICK是您没看仔细,他前面代码直接RETI了”

STC FreeRTOS的移植部分的代码每一行我都看了,没有 ...

想确定一下你的方案,
1.OS系统用几个中断源 , 是 1个(T0), 还是 2个(增加 1个 PendSv 中断) ?
2. 用户用了 N个中断, 是否 每一个都要加(进入中断嵌套计数器,退出中断任务切换函数)?

LAOXU 发表于 2024-3-27 06:40:47

3, 切换是否要等待全部用户中断(中断嵌套计数器为0时)退出时才执行?

LAOXU 发表于 2024-3-27 07:11:49

tzz1983

2.    本主题的[考题],我心中已经有个答案,只是我已经放弃答题了(弃权都不可再答)。
  LAOXU考官不要认为此题难解或无解,让子弹再飞一会。

--------------------------------------------------------------------

子弹飞够了。能否公布你的答案?

gentleman 发表于 2024-3-27 07:28:29

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

现在有 三个中断 A B C


仔细想了这个例子

感觉C 后切换任务x还是不对


FreeROTS中中断级 > 任务级
任务切换不在T0也得再 最低级的A 退出后 切换


新的想法是 在嵌套计数器--; 或中断退出后;
if中断计数器 == 0 进行任务切换


丢tick 的问题,也有个想法,但要看t0 模式3是否支持 手动装初值验证




tzz1983 发表于 2024-3-27 07:37:40

本帖最后由 tzz1983 于 2024-3-27 07:42 编辑

gentleman 发表于 2024-3-27 07:28
仔细想了这个例子

感觉C 后切换任务x还是不对

对,你说对了,是在C切换,( 最后一个退出中断的那断)

上面说C是我的笔误,表达错误,我自己也没发现表达错了


"

现在有 三个中断 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切换任务, 被你搞得有点上头了!!

tzz1983 发表于 2024-3-27 07:46:22

本帖最后由 tzz1983 于 2024-3-27 07:49 编辑

gentleman 发表于 2024-3-27 07:28
仔细想了这个例子

感觉C 后切换任务x还是不对

"FreeROTS中中断级 > 任务级
任务切换不在T0也得再 最低级的A 退出后 切换"

这个说法是对的, 前提是如果是用额面的中断源切换任务, 而不是你现在的最高优先级TICK, 总的来说就是现在你这东西改的有点不伦不类了.

还有一种就是即将退出中断的前一刻,用代码切换任务, (切换+退出中断)一起处理

接下来你自己研究吧, 这东西还得靠自己悟透

页: 1 2 3 4 5 6 7 8 9 [10] 11 12 13 14 15 16 17 18 19
查看完整版本: 【全部暂停】【方向改为完善官方的FreeRTOS】 随时关EA的 FreeRT