OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5082|回复: 1

【求助】freeRTOS任务输入参数问题

[复制链接]

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-6-16 17:27:34 | 显示全部楼层 |阅读模式
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]

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-6-18 20:57:45 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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