高级会员
- 积分
- 647
- 金钱
- 647
- 注册时间
- 2014-4-29
- 在线时间
- 299 小时
|
10金钱
基本的问题是这样的:1.freeRTOS在任务内定义的无前缀的局部变量,是存放到任务私用的栈区,还是存放到整个程序公用的栈区?
2.在任务内定义的static型静态变量,又存放到哪里?
我遇到的实际问题是这样的:
我在战舰板上移植了一个freeRTOS,版本是8.2.0,st库用的3.5版本,用led实验测试单任务没有问题可以跑起来啦。
然后就试了下多任务,我是这么干的:
1.先配置好硬件
2.主函数里创建一个Start任务,这个任务的功能是创建2个led任务,使他们以不同的频率闪烁,然后start任务删除了自己。
(start任务临时定义了一些局部变量,然后在创建2个led任务的时候,把变量的地址传递给了他们。)
3.启动freeRTOS。
代码一会放在下面。
测试的结果是可以正常运行,但是后来我一想好像不对,教程里面任务的输入参数都是预先定义在main函数外面的const型变量,根本就不再栈里面。
但是我定义的输入参数是在任务内部定义的局部变量,应该放到栈区的,这样传递参数的指针会不会变成野指针呢?
测试确实好使,说明我想的不对,但是又不知道为什么。
求助老司机指点。
代码如下:
[mw_shl_code=c,true]#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
typedef struct
{
void (*BlinkAddr)(void);
u32 delayMs;
}blinkMode;
void TaskStart(void *para);
void TaskBlink(void *para);
void BlinkLed0(void);
void BlinkLed1(void);
xTaskHandle xTaskStartHandle;
int main(void)
{
NVIC_Configuration();
uart_init(9600);
LED_Init(); //
printf("hello world\t\n");
LED0=1;
LED1=1;
xTaskCreate( TaskStart, "Task Start", 1000, NULL, 3, xTaskStartHandle );
vTaskStartScheduler();
while(1)
{
}
}
void TaskStart(void *para)
{
blinkMode blinkStrategy[2] =
{
{&BlinkLed0,1000},{&BlinkLed1,200},
};
xTaskCreate( TaskBlink, "Task blink 0", 1000, &blinkStrategy[0], 1, NULL );
xTaskCreate( TaskBlink, "Task blink 1", 1000, &blinkStrategy[1], 2, NULL );
vTaskDelete( xTaskStartHandle);
}
void TaskBlink(void *para)
{
blinkMode *strategyPtr = (blinkMode *)para;
while(1)
{
strategyPtr->BlinkAddr();
vTaskDelay(strategyPtr->delayMs);
}
}
void BlinkLed0(void)
{
static u8 blink0 = 0;
blink0 ^= 0x01;
LED0 = blink0;
}
void BlinkLed1(void)
{
static u8 blink1 = 0;
blink1 ^= 0x01;
LED1 = blink1;
}
[/mw_shl_code]
|
|