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

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

[复制链接]

该用户从未签到

20

主题

551

回帖

1825

积分

荣誉版主

积分
1825
发表于 2024-3-24 08:34:54 | 显示全部楼层
本帖最后由 tzz1983 于 2024-3-24 08:48 编辑
LAOXU 发表于 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
回复 支持 反对 送花

使用道具 举报

该用户从未签到

20

主题

551

回帖

1825

积分

荣誉版主

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

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

使用道具 举报

  • TA的每日心情
    奋斗
    3 小时前
  • 签到天数: 163 天

    [LV.7]常住居民III

    1

    主题

    154

    回帖

    635

    积分

    高级会员

    积分
    635
    发表于 2024-3-24 09:14:15 | 显示全部楼层
    tzz1983 发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

    积分
    3990
    发表于 2024-3-24 09:34:26 | 显示全部楼层
    tzz1983 发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

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

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

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

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

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

    使用道具 举报

  • TA的每日心情
    开心
    6 天前
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    872

    回帖

    3990

    积分

    荣誉版主

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

    使用道具 举报

    该用户从未签到

    20

    主题

    551

    回帖

    1825

    积分

    荣誉版主

    积分
    1825
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 05:39
  • 签到天数: 163 天

    [LV.7]常住居民III

    17

    主题

    371

    回帖

    1327

    积分

    荣誉版主

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

    深有同感!
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    661

    回帖

    1万

    积分

    荣誉版主

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

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

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

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


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


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


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



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

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 11:35
  • 签到天数: 164 天

    [LV.7]常住居民III

    5

    主题

    524

    回帖

    2208

    积分

    荣誉版主

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

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-9 03:41 , Processed in 0.069404 second(s), 64 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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