熊仔 发表于 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
页: 1 2 3 4 [5] 6
查看完整版本: 关于"访问"的表达是否准确?