kanfeng 发表于 2008-4-30 08:12:18

UCOS任务中的局部变量保存

请问下ucos里一个任务中的局部变量 如int aa, char bb; 这些局部变量在发生任务切换时 被保存到什么地方了?相应的保存代码又在什么地方呢?

blackcafe 发表于 2008-4-30 08:30:33

任务自己的堆栈里,编译器编译时就分配好空间了

yangsen 发表于 2008-4-30 09:03:43

任务堆栈不是编译器编译时分配好的空间,是你在创建任务时的函数里传递的堆栈空间位置,就是INT8UOSTaskCreate (void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio)里的OS_STK *ptos。在不同任务切换时实际上也同时在几个事先开出的存储区之间切换。
至于局部变量有两种情况:
一种是编译器分配到寄存器中使用的,这种局部变量会在任务切换时保存到任务自己的堆栈
另一种情况是从堆中分配的,就是在系统公共RAM区分配的存储空间,这种空间应当在函数返回是释放的,但是你的任务是没有返回的死循环所以这个空间没有释放

kanfeng 发表于 2008-4-30 09:16:29

那假设系统有10个任务 每个任务中都有char bb;这样的局部变量字符串数组 因为任务是死循环形式 那编译器在为10个任务的局部数组分配空间时 是否可能出现不同任务之间的局部数组所在的系统公共RAM地址相同 即在任务1中的一个局部数组char bb; 被安排在RAM中的0x50 - 0x64之间 而任务2中的局部数组char bb;也被安排在0x50 - 0x64之间如果出现这种情况的话 那么在任务切换时 岂不是会发生任务中局部变量数组混乱 任务运行出错的情况?

yangsen 发表于 2008-4-30 09:22:59

不会的,局部变量对其它函数是不可见的,因此编译器编译时或者说程序运行时是从可用空间来分配的。如果出现上面的情况那就是你的编译器有问题了,呵呵。

kanfeng 发表于 2008-4-30 09:52:08

有没有关于编译器如何对局部变量进行处理方面的资料啊 ? 我还是很糊涂

kanfeng 发表于 2008-4-30 09:53:34

还有你的意思是不是 如果任务中的局部变量放在堆中的话在做任务切换时 程序根本就不对此任务的局部变量做任何处理 ?

yangsen 发表于 2008-4-30 10:37:27

要详细了解的话你得去看看编译原理和C语言中变量处理方面的书。严格说在ucos里,任务就是一个函数所以切换时对保存在堆中断局部变量是做保存的,因为其它函数不会去破坏它。你也可以看看编译器的说明书中有关混合编程的部分,一般也会有详细的参数传递,寄存器分配说明

kanfeng 发表于 2008-4-30 10:49:47

7楼 可以把QQ给我吗?我有问题请教你

kanfeng 发表于 2008-4-30 11:33:59

还有我想在UCOS里用C++编程因为UCOS核是用C写的所以我在用C++编程是需要注意那些地方呢?

yangsen 发表于 2008-4-30 12:20:28

9楼,我没有用过C++编UCOS,这还真帮不到你。我的QQ:379100379

bucker 发表于 2008-5-18 15:58:28

只要你用C++编译器支持的话,在你的应用程序中是可以用C++编程的,因为C可以看做C++的子集。但是,本人在用Borland C时,似乎使用C++就编译出错,而ADS里就不存在问题。
页: [1]
查看完整版本: UCOS任务中的局部变量保存