找回密码
 立即注册
楼主: tzz1983

关于"访问"的表达是否准确?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:432
  • 最近打卡:2025-05-01 16:19:56

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2023-9-21 14:26:57 | 显示全部楼层
本帖最后由 CosyOS 于 2023-9-21 14:35 编辑
熊*** 发表于 2023-9-21 12:59
中段发生后能执行两条指令,如果两条都不是特殊指令,那就进入中断服务程序,分析确实能打断。
讨论:是不是 ...

我认为你的分析是对的,如果有人在中断中EA = 0,那也是临时的关闭,是要保护一段代码,退出中断前会再次开启的,否则也是忘了开启(bug)。
如果他忘记了开启,当返回后你又关了中断,最后又恢复原状态(开启),还算是帮他修复了bug。
再有,Arm内核的话,无论是primask、faultmask、basepri,保存原状态和关中断也只能分成两步执行,无法一条指令完成。

如:
mrs r0, primask
cpsid i
所以说,如果EA的读和写必须要一条指令完成不可分割的话,那Arm内核就废了,可以退出市场了。
但由于51/251有JBC指令,不用白不用。
所以我看这个问题还是在于自己的选择,不是绝对的该如何如何。






点评

是的,我也想到了ARM的方式,都是这么干的。 只是类似STC8在中断中代码切换任务方式,中断RETI退出后是不会返回打断的位置,这个属于特殊情况。 使用场景不一样,只能说分开讨论了。  详情 回复 发表于 2023-9-21 18:13
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-9-21 14:38:50 | 显示全部楼层
Cos*** 发表于 2023-9-21 14:26
我认为你的分析是对的,如果有人在中断中EA = 0,那也是临时的关闭,是要保护一段代码,退出中断前会再次 ...

两位, 你们是做什么工作的呀, 聊聊你们的工作呗, 我看你们全天在线啊

点评

我是自由职业者  发表于 2023-9-21 14:46
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:432
  • 最近打卡:2025-05-01 16:19:56

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2023-9-21 14:44:37 | 显示全部楼层
还有一点,Arm内核虽然读和写中断寄存器是两条指令(可分割),但读是保存到本地的,退出临界区的时候再传参进去恢复中断的原状态。
回复 支持 反对

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

积分
929
发表于 2023-9-21 18:13:56 | 显示全部楼层
Cos*** 发表于 2023-9-21 14:26
我认为你的分析是对的,如果有人在中断中EA = 0,那也是临时的关闭,是要保护一段代码,退出中断前会再次 ...

是的,我也想到了ARM的方式,都是这么干的。

只是类似STC8在中断中代码切换任务方式,中断RETI退出后是不会返回打断的位置,这个属于特殊情况。
使用场景不一样,只能说分开讨论了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-9-22 08:23:18 | 显示全部楼层
熊*** 发表于 2023-9-21 18:13
是的,我也想到了ARM的方式,都是这么干的。

只是类似STC8在中断中代码切换任务方式,中断RETI退出后是 ...

熊仔: 刚才去看了一下你的代码,


        //OSPrioCur = OSPrioHighRdy;
         //OSTCBCur  = OSTCBHighRdy;

这两句你真的不保护了呀.
你说不用保存EA, 直接EA=0 , EA=1; 这个我可以认同.
但现在为何EA=0也取消了呢, 我没搞懂, 能解释一下吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-9-22 08:49:26 | 显示全部楼层
tzz1*** 发表于 2023-9-22 08:23
熊仔: 刚才去看了一下你的代码,

看错了, 这里是代码切换任务, 不用解释了

点评

嵌套的时候代码切换任务,不需要保护,因为处于嵌套区域,本来关闭中断的。  详情 回复 发表于 2023-9-22 08:50
回复 支持 反对

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

积分
929
发表于 2023-9-22 08:50:14 | 显示全部楼层
tzz1*** 发表于 2023-9-22 08:49
看错了, 这里是代码切换任务, 不用解释了

嵌套的时候代码切换任务,不需要保护,因为处于嵌套区域,本来关闭中断的。

点评

有另一个问题问你,待会回复,我在编辑  发表于 2023-9-22 09:01
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-9-22 09:09:06 | 显示全部楼层
熊*** 发表于 2023-9-22 08:50
嵌套的时候代码切换任务,不需要保护,因为处于嵌套区域,本来关闭中断的。 ...

捕获.JPG

捕获2.JPG

我查了一下, OS_TASK_SW(), 全OS文中只用一次, 在未退出临界区时使用的,也就是说:
1,任务级主动切换任务, 必然是代码切换模式
2,在第一张图片时, 看到先退出临界区, 再调OSCtxSw(),  如果未嵌套, 此时EA已打开, 将在切换任务时缺少临界段保护
3. 应该还有其它问题 , 等会再说, 你先解释一下

点评

你看注释,嵌套的时候提前退出,退出也是EA=0  详情 回复 发表于 2023-9-22 10:13
回复 支持 反对

使用道具 举报 送花

11

主题

340

回帖

929

积分

荣誉版主

积分
929
发表于 2023-9-22 10:13:00 | 显示全部楼层
tzz1*** 发表于 2023-9-22 09:09
我查了一下, OS_TASK_SW(), 全OS文中只用一次, 在未退出临界区时使用的,也就是说:
1,任务级主动切换 ...

你看注释,嵌套的时候提前退出,退出也是EA=0

点评

你没发现未嵌套时, 也是用这个方法吗  发表于 2023-9-22 10:38
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2023-9-22 10:45:02 | 显示全部楼层
熊*** 发表于 2023-9-22 10:13
你看注释,嵌套的时候提前退出,退出也是EA=0

现在假我的常规操作:
OSTimeDly(500);
此时是不是会由OS调用 OS_Sched()切换任务;(当前没有深度临界区嵌套)
然后在OS_Sched()调用 OS_ENTER_CRITICAL(); 进入临界区, (此时是一级临界区,未发生嵌套)
然后再调用 OS_TASK_SW();   
在 OS_TASK_SW()中, 提前退出临界区, 使用的是OS_EXIT_CRITICAL(); 此时EA恢复到 EA=1了
然后又调用了OSCtxSw();
此时是不是开了中断, 用代码切换任务?
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 15:42 , Processed in 0.135314 second(s), 116 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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