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

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

[复制链接]

该用户从未签到

63

主题

703

回帖

1万

积分

荣誉版主

积分
10908
 楼主| 发表于 2024-3-22 18:16:33 | 显示全部楼层
LAOXU 发表于 2024-3-22 17:28
既然杨老师要讨论, 顶楼的题太简单了, 只有2次调用.

现改成, 51有 4个中断级, 每个中断优先级中 有一次调 ...


谢谢回答。
(1)你想提高题目的难度,我成全你,我修改后放在在顶楼。
(2)你给出的方法是“把这个函数写成可重入的, 无论 N次调用都不会出问题”。虽然你的这个方法也适用于新题目,但是你的这个方法对于新手太难了。你能不能为使用C51标准库函数对STC8位单片机编程的新手重新推荐一些更简单的方法?


回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    昨天 00:57
  • 签到天数: 148 天

    [LV.7]常住居民III

    39

    主题

    889

    回帖

    4154

    积分

    荣誉版主

    积分
    4154
    发表于 2024-3-22 18:18:25 | 显示全部楼层
    大家说, 麻烦吗?

    还不如用 251(STC32) ,  什么都不用管, 编译后就 OK

    点评

    你老再你的帖子里不是对我说: 你老跑题啦~~~ 咱们现在说 keil C51怎么解决. 那么请你别双标,请你也别跑题,说说“C51怎么解决”  详情 回复 发表于 2024-3-22 18:41
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10908
     楼主| 发表于 2024-3-22 18:38:03 | 显示全部楼层
    LAOXU 发表于 2024-3-22 17:33
    最简单的方法,

    在底层(主程序)中, 调用前先关中断, 执行调用 strncpy , 调用后再打开中断 ...

    谢谢。
    (1)为了新手能够理解下面将你的方法“最简单的方法,在底层(主程序)中, 调用前先关中断, 执行调用 strncpy , 调用后再打开中断”写成程序:
    void main(void)
    {  do{
        EA=0;
       strncpy (cc, a2, 8);
       EA=1;
       }while(1);
    }



    (2)既然解决的方法那么简单,你又早就知道,你装神弄鬼地在你的《C51 和 C251 标准库的区别》那个帖子里借你老师的口吓唬大家干什么?为什么不一开始就告诉新手怎么解决?你还出题目考我,不就是想炫耀你会用汇编编个字符串函数?你的目的达到了,我们大家都知道了。


    (3)我问你:你的提高难度那个4个不同中断优先级的中断都调用同一个不可重入函数的题目,除了你知道的那个只有你会用汇编语言“改写函数的方法”,你还知道其他“不改写函数的方法”的方法吗?
    如果你知道,就请你在这里告诉大家,如果不知道,那大家再一起来研究。请你直接回答知道不知道?





    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10908
     楼主| 发表于 2024-3-22 18:41:57 | 显示全部楼层
    LAOXU 发表于 2024-3-22 18:18
    大家说, 麻烦吗?

    还不如用 251(STC32) ,  什么都不用管, 编译后就 OK

    你老再你的帖子里不是对我说:

    你老跑题啦~~~ 咱们现在说 keil C51怎么解决.



    那么请你别双标,请你也别跑题,说说“C51怎么解决”
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10908
     楼主| 发表于 2024-3-22 18:56:24 | 显示全部楼层
    LAOXU 发表于 2024-3-22 17:28
    既然杨老师要讨论, 顶楼的题太简单了, 只有2次调用.

    现改成, 51有 4个中断级, 每个中断优先级中 有一次调 ...

    我已经把新题目放在1楼了,请检查下是否符合你的要求
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 12:52
  • 签到天数: 175 天

    [LV.7]常住居民III

    5

    主题

    580

    回帖

    2355

    积分

    荣誉版主

    积分
    2355
    发表于 2024-3-22 21:21:39 | 显示全部楼层
    本帖最后由 CosyOS 于 2024-3-22 21:36 编辑

    这两个题目,只有题目2,可能会出现对a2数组的重入读访问,但“读读”是不怕重入的;
    除此之外都不存在对全局资源(各个数组)的重入访问,所以两个题目都不需要考虑对全局资源(各个数组)的互斥访问问题,
    只需解决“strncpy”是不可重入函数的问题,设法让其可重入即可。
    针对这两个题目,的确有一个最简单的方法,即不用关中断,也不用临界区等,更不用重写strncpy。

    我还是不要说了,留给其他朋友思考吧。。。

    点评

    别说出来: (1)别让LAOXU知道。 (2)相信我,留给我说会比你说得更好  详情 回复 发表于 2024-3-22 23:10
    不是的,禁用overlay解决不了这个问题。  详情 回复 发表于 2024-3-22 21:47
    禁用覆盖吗,那代价有点大,静等大侠们的结果...  发表于 2024-3-22 21:38
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 12:52
  • 签到天数: 175 天

    [LV.7]常住居民III

    5

    主题

    580

    回帖

    2355

    积分

    荣誉版主

    积分
    2355
    发表于 2024-3-22 21:47:12 | 显示全部楼层
    本帖最后由 CosyOS 于 2024-3-22 21:49 编辑
    CosyOS 发表于 2024-3-22 21:21
    这两个题目,只有题目2,可能会出现对a2数组的重入读访问,但“读读”是不怕重入的;
    除此之外都不存在对全 ...

    不是的,禁用overlay解决不了这个问题。
    如果谁知道答案也请不要说出来,好让更多的朋友有机会思考。

    点评

    有意思, 如果是我, while(n--)*a++=*b++; 这应该不算答案吧,这算重写了 继续等你们的答案  详情 回复 发表于 2024-3-22 21:55
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    20

    主题

    576

    回帖

    1197

    积分

    荣誉版主

    积分
    1197
    发表于 2024-3-22 21:55:44 | 显示全部楼层
    CosyOS 发表于 2024-3-22 21:47
    不是的,禁用overlay解决不了这个问题。
    如果谁知道答案也请不要说出来,好让更多的朋友有机会思考。
    ...

    有意思,
    如果是我, while(n--)*a++=*b++;
    这应该不算答案吧,这算重写了

    继续等你们的答案

    点评

    你也别说: (1)别让LAOXU知道。 (2)相信我,留给我说会比你说得更好  详情 回复 发表于 2024-3-22 23:11
    是的,这算本地代码  发表于 2024-3-22 21:57
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10908
     楼主| 发表于 2024-3-22 23:10:29 | 显示全部楼层
    CosyOS 发表于 2024-3-22 21:21
    这两个题目,只有题目2,可能会出现对a2数组的重入读访问,但“读读”是不怕重入的;
    除此之外都不存在对全 ...

    别说出来:

    (1)别让LAOXU知道。
    (2)相信我,留给我说会比你说得更好

    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    63

    主题

    703

    回帖

    1万

    积分

    荣誉版主

    积分
    10908
     楼主| 发表于 2024-3-22 23:11:45 | 显示全部楼层
    tzz1983 发表于 2024-3-22 21:55
    有意思,
    如果是我, while(n--)*a++=*b++;
    这应该不算答案吧,这算重写了

    你也别说:

    (1)别让LAOXU知道。
    (2)相信我,留给我说会比你说得更好

    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 04:29 , Processed in 0.078843 second(s), 71 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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