熊仔
发表于 2023-9-22 10:46:34
后面的else就是没嵌套中断方式。你仿真看看吧
tzz1983
发表于 2023-9-22 10:49:51
熊仔 发表于 2023-9-22 10:46
后面的else就是没嵌套中断方式。你仿真看看吧
if (cpu_sr==0) 已经符合条件了呀
熊仔
发表于 2023-9-22 10:58:51
本帖最后由 熊仔 于 2023-9-22 11:00 编辑
tzz1983 发表于 2023-9-22 10:49
if (cpu_sr==0) 已经符合条件了呀
cpu_sr==0x80呢?去哪里了?
第一层嵌套难道不是cpu_sr=0x80?不然怎么开中断
熊仔
发表于 2023-9-22 11:03:25
您再好好分析吧。或者仿真看看。
熊仔
发表于 2023-9-22 11:05:08
第一级cpu_sr=0x80
第二级 cpu_sr=0x00
所以只要cpu_sr==0x00,就是在嵌套里面,
这么好理解,咋看不懂呢?我也想不明白你为啥看不懂。
tzz1983
发表于 2023-9-22 11:30:27
熊仔 发表于 2023-9-22 11:05
第一级cpu_sr=0x80
第二级 cpu_sr=0x00
所以只要cpu_sr==0x00,就是在嵌套里面,
耐心挺好的, 为我解答了, 谢谢. 你会一直这么有耐心吗?
还有一个问题:
假设: <嵌套临界区中切换任务, 并非是为了等待一个事件,或其它任何原因进入阻塞, 在嵌套临界区中切换任务,本身就是为了切换而切换, 或者说只是为了好玩.>那么无可厚非了.
如果这个假设不成立(表示嵌套临界区可以进入阻塞): 那么我可以在嵌套临界区中等待一个事件. 那么看下面的分析.
现在我在任务A嵌套临界区中等待一个事件, 此时OS会切换任务, 并且此时没有其它任务就绪, 那么进入了空闲任务.
注意, 因为是在临界区用代码切换到空闲任务的, 所以中断此时是没开的.
请问在空闲任务中, 没开任何中断的前提下, (时钟现在失灵了,其它任何中断都失灵了), 如何离开空闲任务, 是不是陷里面了?
熊仔
发表于 2023-9-22 11:38:48
本帖最后由 熊仔 于 2023-9-22 11:43 编辑
tzz1983 发表于 2023-9-22 11:30
耐心挺好的, 为我解答了, 谢谢. 你会一直这么有耐心吗?
还有一个问题:
中断没有开,肯定不能阻塞的
带阻塞服务的都是需要滴答定时器调度的吧。默莫非我理解错了?
tzz1983
发表于 2023-9-22 11:51:41
本帖最后由 tzz1983 于 2023-9-22 11:53 编辑
熊仔 发表于 2023-9-22 11:38
中断没有开,肯定不能阻塞的
带阻塞服务的都是需要滴答定时器调度的吧。默莫非我理解错了?
...
我知道你会这么回答, 我也知道不能. 我想表达的意思, 你为何要切换?
2. 此时你是要切换到的目标任务, 是高于自身的呢,还是低的? (UCOS不存在同等优先级) , 如果说要切到高的, 那么"不劳你费心", 高优先级就绪时OS已经提前切换过去了. 如果你硬要说在临界区OS无法使高优先级就绪, 那么结果是, 你最终切换到的任务, 是你自己.
3. 如果切换到低的, 你怎么切换? //OSPrioCur = OSPrioHighRdy; //OSTCBCur= OSTCBHighRdy; 这两句话是假的吗?你不是又切回自己了吗, 何必呢
熊仔
发表于 2023-9-22 12:00:42
除了阻塞的不能用,还有很多其他服务能用吧。OS_Sched();会获取就绪的更高优先级。不应该又切回自己。
当然一般人不会在临界区切换任务,我也同意这个说法。
tzz1983
发表于 2023-9-22 12:17:26
熊仔 发表于 2023-9-22 12:00
除了阻塞的不能用,还有很多其他服务能用吧。OS_Sched();会获取就绪的更高优先级。不应该又切回自己。
当然 ...
OS_Sched()会获取更高级任务? OS_Sched()是不是OS自身的代码?在这之前高级任务就绪的时候会不会发生OS主导的任务切换?
你能不能演示出一个例子: 高优先级任务就绪时,(任务非锁状态),OS不切换, 然后等着你来进入临界欧嵌套, 然后再切换. 能吗, 如果能, 那证明你找到了UCOS的BUG