找回密码
 立即注册
楼主: 杨为民

STC单片机 uC/OS-II核心技术(12):关于临界区保护和函数可重入的测试题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-3-24 08:34:54 | 显示全部楼层
本帖最后由 tzz1983 于 2024-3-24 08:48 编辑
LAO*** 发表于 2024-3-24 03:35
本水贴, 没一点技术含量, 讨论了 N天, 得出一个傻子都会的结论, 使用万金油 关中断.

我是没本事给 X老师 ...

问:关了中断EA, OS就不能工作了.
答:目前本坛三个常见的RTOS  "FreeRTOS, uCOS, CosyOS" 都依赖中断切换任务。 其中FreeRTOS or STC32G12K128 官方简洁可靠版V1.0.2 ,是基于时钟滴答切换任务。

问:中断是 OS的灵魂, 关闭 EA, OS魂都没了, 还能干啥?
答:中断不仅是OS的灵魂,不使用OS时也同样如此。
中断是一切设计多样性的源泉,同时也是MCU硬件组成部分的重要构件。
现有的OS高度依赖中断,关闭EA会使OS瘫痪。
没有中断时祼机能干的事很多,但枯燥,性能大打折扣。

问:我这道题就是反向思维, 写(或移植)个 OS系统, 离开 EA, 即无论用户何时何地关中断, 都不能影响 OS系统的运行.”
答:比较简单,OS核心就是切换任务,用函数功能代码替代中断可切换任务(主动切换),即可达到OS彻底离开中断的目的。
但是这个没有意义,如问2所说,没有灵魂,没有性能。
打个简单的比方吧,你问STC能不能做出没有中断功能的MCU型号,STC回答你->能! 但会去做吗?


点评

你好,我新开了一个贴来回答这个问题,你这楼的意见我已复制到 《许出题我来答:写(或移植)个 OS系统, 无论何时何地关中断, 都不能影响 OS系统的运行》(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=7  详情 回复 发表于 2024-3-24 12:17
你把我的意思理解错啦~~~ 要让你们 OS大虾出马, 当然要有点难度的. 再解释一下, 用户使用任何中断, 开关中断, 都与本 OS 无关, OS的使用与性能, 与现在的通用级 OS标准, 无什么差别, 仅仅强调的是, 用户开关中断  详情 回复 发表于 2024-3-24 09:34
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-3-24 09:07:12 | 显示全部楼层
Cos*** 发表于 2024-3-23 23:26
首先声明:我所说的方法仅适用于本次讨论的题目,如果换一个题目可能根本就不行了,
具有很强的针对性。

@CosyOS 你这个答案可馋死我了,思考了许久未果。
本以为你会以队列+服务的方式来调用不可重入函数。
但仔细想想也不对呀。如果不用OS,服务必然是一个中断。
但是要使别的中断也能调用这个服务,那服务中断就必须是唯一的最高优先级。
问题又出来了,即是唯一的最高优先,那和关中断就没区别了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:501
  • 最近打卡:2025-05-01 14:43:21

1

主题

183

回帖

1863

积分

金牌会员

积分
1863
发表于 2024-3-24 09:14:15 | 显示全部楼层
tzz1*** 发表于 2024-3-24 08:34
问:关了中断EA, OS就不能工作了.
答:目前本坛三个常见的RTOS  "FreeRTOS, uCOS, CosyOS" 都依赖中断切换 ...

确实如此,我个人理解,不用太纠结于是否关中断这样的问题,该关还得关。其实是否关中断不是本质,问题的本质是系统对异步信号响应的延时时间的长短问题。就算你不关中断,重入的问题还是存在,你也要有相应的措施来处理,这些措施也一样会造成响应的延时,相对而言,关中断可能还会更简单一些。

点评

你好,我新开了一个贴来回答这个问题,你这楼的意见我已复制到 《许出题我来答:写(或移植)个 OS系统, 无论何时何地关中断, 都不能影响 OS系统的运行》(https://www.stcaimcu.com/forum.php?mod=viewthread&tid=74  详情 回复 发表于 2024-3-24 12:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-3-24 09:34:26 | 显示全部楼层
tzz1*** 发表于 2024-3-24 08:34
问:关了中断EA, OS就不能工作了.
答:目前本坛三个常见的RTOS  "FreeRTOS, uCOS, CosyOS" 都依赖中断切换 ...

你把我的意思理解错啦~~~

要让你们 OS大虾出马, 当然要有点难度的.

再解释一下, 用户使用任何中断, 开关中断, 都与本 OS 无关,

OS的使用与性能, 与现在的通用级 OS标准, 无什么差别,
仅仅强调的是, 用户开关中断, 对 OS无影响, OS该于啥还是干啥.

点评

你好,我新开了一个贴来回答你的这个问题,你在这楼出的题目我已复制到 《许出题我来答:写(或移植)个 OS系统, 无论何时何地关中断, 都不能影响 OS系统的运行》(https://www.stcaimcu.com/forum.php?mod=viewthrea  详情 回复 发表于 2024-3-24 12:21
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-3-24 09:55:31 | 显示全部楼层
tzz1983
平常我很少用库函数的,这个函数在哪个头文件?或由哪个库函数间接调用的?

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

这是个内嵌函数, 无需库调用, 用与指针类参数写入指定指针.

如要用, 拷贝内容文本以 .A51 后缀存盘即可, 可自行编译成 LIB文件, 使用时将 LIB 或 A51 文件, 加入项目中即可.

我是直接将此 LIB文件, 替换 Keil 标准库后使用, 项目中不用再外挂 LIB 或 A51 文件了.
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1327

回帖

5395

积分

荣誉版主

积分
5395
发表于 2024-3-24 09:58:25 | 显示全部楼层
类似这种定义  char ** prt  , 此类型数据的写入.
回复 支持 反对

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-3-24 10:04:26 | 显示全部楼层
本帖最后由 tzz1983 于 2024-3-24 10:17 编辑

关于库函数个人的一些感想:
    经常在书本上看到表达这样一个意思:合理的利用库函数,不但可以提高效率(大致意思是你很难编写出比库函数更高效的代码了),还能使代码简结,易读。
但是我自己却很少去用库函数,除了printf()之外,基本不用,是不是我的路走偏了

    原因是,任何现有的东西,都不可能适应(现有的,未来的)一切。虽然说标准库尽量在往这方面做,但是仍然还是没能够做到。
比如malloc(),用的人少之又少,取而代之的是 OS_malloc(), 或XX_malloc();

    我在移值一些通用软件的时候,比如RTOS或GUI,经常发现有类似 xxx_memcpy()这种代码, 为什么他们不直接用memcpy()?估计也是怕万一出什么幺儿子吧。

    实战项目中,做一个替代库函数功能的函数并不困难,因为此时已经不需要具备通用性,只需要能适用现有项目即可,比写通用库函数简单多了。
比如显示一个浮点数。除了sprintf(),  难道就不能自己实现吗。 如果需要两位小数,最简单的办法就是:(long)(float*100),接下来当整形处理了。(这里是举例,并不是最优)
再如本帖主题中的strncpy(), 执行本地代码 while(n--)*a++=*b++;来替代,没有调用过程,要怎么中断都行,这样真的不香吗。
     总结来说就是实战中,不要拘泥于一种形式,无招胜有招! 库函数能适用的,咱就用。不好用的,它就是一个参照,咱自立山头。

     说说LAOXU, LAOXU的精神是值得称赞的,这是对广大码农的无私奉献。
我是一个比较务实的人,现在我还没有用到你做的那些功能,所以没有去参照过。如果有一天要用到,必然要去参照一番。这是非常有意义的。

最后,建议你不要直接替代标准库函数,而是提供一套新的库函数。比如strncpy(), 你可以出一个 l_strncpy();
留给用户一个选择的余地。原因无它,使用者都需要谨慎,哪怕是你已经很自信了,仍需要时间的验证。


点评

我自已用, 怎么方便随意使, 都没问题, 推荐给大家的, 除了提供外挂标准库, 还提供源代码, 用以直接替代标准库函数, 你想用就在项目中加入外挂标准库或源代码, 自动替代原标准库. 不想用就直接删除 外挂标准库或源  详情 回复 发表于 2024-3-24 12:10
深有同感!  详情 回复 发表于 2024-3-24 10:41
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-01 04:31:49

24

主题

515

回帖

986

积分

荣誉版主

积分
986
发表于 2024-3-24 10:41:39 | 显示全部楼层
tzz1*** 发表于 2024-3-24 10:04
关于库函数个人的一些感想:
    经常在书本上看到表达这样一个意思:合理的利用库函数,不但可以提高效率 ...

深有同感!
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-3-24 11:26:20 | 显示全部楼层
本帖最后由 杨为民 于 2024-3-24 12:00 编辑
LAO*** 发表于 2024-3-24 03:35
本水贴, 没一点技术含量, 讨论了 N天, 得出一个傻子都会的结论, 使用万金油 关中断.

我是没本事给 X老师 ...

武林之所以精彩,就是因为有华山论剑!

LAOXU这次题目出得好,使大家有了一个交流的机会。
这次我不太厚道,把你出的题目反考回你,这里给你说抱歉了


这次你69楼出得题目非常好,我愿意回答。


LAOXU,以后我会针对你的每一个题目,都新开一个专门回答你的帖子,帖子题目将用“许出题我来答”来标识:
(1)以后LAOXU你只管出题我和广大网友(大家参与)都来回答和讨论。
(2)希望你的题目越难越好,问题的代表性越强越好,能解决新手入门碰到的问题更好,能提前与STC将要推出的两款新类型单片机结合最好。
(3)你提的问题可以你自己暂时还不能回答的,我的帖子只回答和讨论(大概率我也回答不了)你的问题,绝不再要求你回答,你的身份就是“考官”,我回答出了算我及格。
(4)如果你知道答案:
第一种方法是先你给出你知道的所有答案。评判的标准是我必须用另外一种方法来解决问题,我想不出新方法算我输,我想出了算我赢。
第二种方法是你先别说,也别提示,让大家讨论。我答不出算我输,答出了算我赢。我答出了后,你再公布你的答案,算我们平手。
(5)这种形式是单向的,你问我答,我不会向你提问的。


同时也欢迎各位网友也直接向我提问,我相信你的问题也会是其他网友感兴趣或者同样面临的,我会新开一个帖子来回答你,帖子题目将用“你问我答:”来标识。



1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
回复 支持 1 反对 0

使用道具 举报 送花

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

5

主题

1127

回帖

4263

积分

荣誉版主

积分
4263
发表于 2024-3-24 12:01:47 | 显示全部楼层
LAO*** 发表于 2024-3-24 06:58
你好 !
有一个问题, 一直想和你核实,
你在 CosyOS中, PendSV_Handler 使用INT0中断,是否意味着用户不能 ...

是的。
所以该功能可配置,用户应选择一个不使用的硬件中断,对应的端口也不能使用。
另外对该中断还有要求:
1、必须支持置标志位触发,而不是IO口电平触发;
2、在关闭该中断的前提下,置标志位后再开启该中断,可以响应中断。
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:29 , Processed in 0.166798 second(s), 121 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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