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

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:41:32

105

主题

1215

回帖

1万

积分

荣誉版主

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

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


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


回复 支持 反对

使用道具 举报 送花

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

54

主题

1327

回帖

5395

积分

荣誉版主

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

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

点评

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

使用道具 举报 送花

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

105

主题

1215

回帖

1万

积分

荣誉版主

积分
12882
发表于 2024-3-22 18:38:03 | 显示全部楼层
LAO*** 发表于 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个不同中断优先级的中断都调用同一个不可重入函数的题目,除了你知道的那个只有你会用汇编语言“改写函数的方法”,你还知道其他“不改写函数的方法”的方法吗?
如果你知道,就请你在这里告诉大家,如果不知道,那大家再一起来研究。请你直接回答知道不知道?





回复 支持 反对

使用道具 举报 送花

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

105

主题

1215

回帖

1万

积分

荣誉版主

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

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

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

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



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

使用道具 举报 送花

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

105

主题

1215

回帖

1万

积分

荣誉版主

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

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

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

使用道具 举报 送花

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

5

主题

1127

回帖

4263

积分

荣誉版主

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

使用道具 举报 送花

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

5

主题

1127

回帖

4263

积分

荣誉版主

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

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

点评

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

使用道具 举报 送花

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

33

主题

1079

回帖

2319

积分

荣誉版主

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

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

继续等你们的答案

点评

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

使用道具 举报 送花

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

105

主题

1215

回帖

1万

积分

荣誉版主

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

别说出来:

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

回复 支持 反对

使用道具 举报 送花

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

105

主题

1215

回帖

1万

积分

荣誉版主

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

你也别说:

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

回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 04:27 , Processed in 0.129360 second(s), 107 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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