杨为民 发表于 2024-3-22 18:16:33

LAOXU 发表于 2024-3-22 17:28
既然杨老师要讨论, 顶楼的题太简单了, 只有2次调用.

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


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


LAOXU 发表于 2024-3-22 18:18:25

大家说, 麻烦吗?

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

杨为民 发表于 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个不同中断优先级的中断都调用同一个不可重入函数的题目,除了你知道的那个只有你会用汇编语言“改写函数的方法”,你还知道其他“不改写函数的方法”的方法吗?
如果你知道,就请你在这里告诉大家,如果不知道,那大家再一起来研究。请你直接回答知道不知道?





杨为民 发表于 2024-3-22 18:41:57

LAOXU 发表于 2024-3-22 18:18
大家说, 麻烦吗?

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

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

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



那么请你别双标,请你也别跑题,说说“C51怎么解决”

杨为民 发表于 2024-3-22 18:56:24

LAOXU 发表于 2024-3-22 17:28
既然杨老师要讨论, 顶楼的题太简单了, 只有2次调用.

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

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

CosyOS 发表于 2024-3-22 21:21:39

本帖最后由 CosyOS 于 2024-3-22 21:36 编辑

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

CosyOS 发表于 2024-3-22 21:47:12

本帖最后由 CosyOS 于 2024-3-22 21:49 编辑

CosyOS 发表于 2024-3-22 21:21
这两个题目,只有题目2,可能会出现对a2数组的重入读访问,但“读读”是不怕重入的;
除此之外都不存在对全 ...
不是的,禁用overlay解决不了这个问题。
如果谁知道答案也请不要说出来,好让更多的朋友有机会思考。

tzz1983 发表于 2024-3-22 21:55:44

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

有意思,
如果是我, while(n--)*a++=*b++;
这应该不算答案吧,这算重写了
{:lol:}
继续等你们的答案

杨为民 发表于 2024-3-22 23:10:29

CosyOS 发表于 2024-3-22 21:21
这两个题目,只有题目2,可能会出现对a2数组的重入读访问,但“读读”是不怕重入的;
除此之外都不存在对全 ...

别说出来:

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

杨为民 发表于 2024-3-22 23:11:45

tzz1983 发表于 2024-3-22 21:55
有意思,
如果是我, while(n--)*a++=*b++;
这应该不算答案吧,这算重写了


你也别说:

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

页: 1 [2] 3 4 5 6 7 8 9 10
查看完整版本: STC单片机 uC/OS-II核心技术(12):关于临界区保护和函数可重入的测试题