pipilee 发表于 2019-7-29 11:11:34

【求助】RTX51 Tiny函数的可重入问题

目前在做的一个项目中,用到RTX51 Tiny,有一个疑问:在一个函数中调用os_wait(),或者os_switch_task()之后,os暂停当前task1,转向另外一个task2,在task2中的执行函数与task1中的函数可能构成Overlay关系吗???

lcw_swust 发表于 2019-7-29 11:46:18

虽然不了解RTX51 Tiny,但是也遇到过主函数与中断同时调用一个函数的情况,会出现问题,
主要因为编译器用全局变量代替局部变量。
此时要用到 reentrant ,将函数变成可重入,使局部变量放入堆栈中,两个地方同时调用也不会干扰。
(如果函数中用到了全局变量仍要小心)
如:
int fun(char a) reentrant
{

}

如果要避免两个地方同时调用一个函数,也可以加一个标志用于等待,似乎可以用信号量还是啥?我也不太清楚了。

chenerbox2 发表于 2019-7-29 11:59:26

感觉2个 task 要是调用一个函数肯定会出问题的

好在这个切换任务都是受你控制的, 自己保证就行了

fsmcu 发表于 2019-7-29 13:00:11

这个是非抢占式的,只要你自己保证在共用函数里面不放弃CPU,主动切换任务,基本就是可靠的了,不要担心重入问题

techbaby 发表于 2019-7-29 13:23:29

用protothreads吧!这种汇编写的代码不了解清楚不敢用啊

xyz543 发表于 2019-7-29 14:04:19

将此工程全部会用到的函数,都如二楼那样在后头加上 reentrant估计就可以了。

pipilee 发表于 2019-7-29 15:37:03

lcw_swust 发表于 2019-7-29 11:46
虽然不了解RTX51 Tiny,但是也遇到过主函数与中断同时调用一个函数的情况,会出现问题,
主要因为编译器用 ...

不是调用同一个函数啊。是在两个task中调用不同的函数,BL51会不会认为两个task中的函数没有调用关系,然后把他们的局部变量进行overlay。
我的疑惑是哪些情况下BL51进行overlay?我的理解是只要函数之间没有直接或间接调用BL51就可以overlay,不知道对不对。

pipilee 发表于 2019-7-29 15:37:39

chenerbox2 发表于 2019-7-29 11:59
感觉2个 task 要是调用一个函数肯定会出问题的

好在这个切换任务都是受你控制的, 自己保证就行了 ...

不是同一个函数啊

lcw_swust 发表于 2019-7-29 16:46:40

pipilee 发表于 2019-7-29 15:37
不是调用同一个函数啊。是在两个task中调用不同的函数,BL51会不会认为两个task中的函数没有调用关系,然 ...

哦,是我理解错了,现在我也糊涂了,要不这样,先直接用,出了问题再说。
要不再试试这个“小小调度器”
https://www.amobbs.com/thread-5702323-1-1.html

chenerbox2 发表于 2019-7-29 19:51:45

pipilee 发表于 2019-7-29 15:37
不是调用同一个函数啊。是在两个task中调用不同的函数,BL51会不会认为两个task中的函数没有调用关系,然 ...

不要特殊处理, 你编译的时候会选rtx51-tiny 选项 这样编译器就知道你用了这个操作系统,肯定会考虑这个问题的
页: [1]
查看完整版本: 【求助】RTX51 Tiny函数的可重入问题