​

以上是历史FreeRtos博客。FreeRtos系列我会坚持更下去。

FreeRtos的任务创建

任务的创建函数

  BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )

参数:
pxTaskCode :要创建的任务函数名称
pcName :具有描述性的任务名称,随便起
usStackDepth :为一个任务分配的栈空间
pvParameters :传参,一般情况下直接给NULL
uxPriority :优先级
pxCreatedTask :创建任务的句柄

返回值:
成功:pdPASS

每个任务都有一个句柄,类比Linux文件下的文件描述符。操作句柄也就
可以操作这个任务。


vTaskDelete();
任务删除
参数:任务句柄

假设我们要创建一个LED闪烁任务,要怎末做内。我们先给大体框架整出来。假设我们有很多任务,我们可以给这些任务放到一个大任务里面。

声明大任务的句柄。
声明小任务(LED)任务的句柄
声明大任务创建的函数。
声明LED任务函数

int main(void)
{
BaseType_t xReturn = pdPASS;//创建任务返回值
xReturn = xTaskCreate(xxxx);
if(xReturn ==pdPASS)//成功
{
vTaskStartScheduler(); //启动任务(任务调度)
}
else
{
return;
}
while(1);

}
void 大任务函数(void)
{
taskENTER_CRITICAL();//进入临界区
创建子任务

删除任务//所有子任务执行完
taskEXIT_CRITICAL();//退出临界区

}

void 子任务函数(void)
{
子任务需要自行的操作。

}

程序源码示例

#include "stm32f10x.h"
#include "led.h"
#include "stdio.h"
#include "usart1.h"
#include "systick.h"
#include "delay.h"
#include "my_key.h"
#include "FreeRTOS.h"
#include "task.h"

static TaskHandle_t AppTaskCreate_Handle = NULL;/* 创建任务句柄 */
static TaskHandle_t LED_Task_Handle = NULL;/* LED 任务句柄 */
static void AppTaskCreate(void);/* 用于创建任务 */
static void LED_Task(void* pvParameters);/* LED_Task 任务实现 */

int main(void)
{
BaseType_t xReturn = pdPASS;//创建任务返回值
NVIC_SetPriorityGrouping(3);
usrat1_config();
systick_config();
key_init();
led_config();
printf("hello\r\n");


//创建任务
/* 创建 AppTaskCreate 任务 */
xReturn = xTaskCreate((TaskFunction_t )AppTaskCreate,/* 任务入口函数 */
(const char *)"AppTaskCreate",/* 任务名字 */
(uint16_t )512,
(void *)NULL,
(UBaseType_t )1,
(TaskHandle_t* )&AppTaskCreate_Handle);/* 任务控制块指针 */

/* 启动任务调度 */
if (pdPASS == xReturn)
{
vTaskStartScheduler();
}
else
{
return -1;
}

while (1); /* 正常不会执行到这里 */
}
static void AppTaskCreate(void)
{
BaseType_t xReturn = pdPASS;/* 定义一个创建信息返回值,默认为 pdPASS */
taskENTER_CRITICAL();
xReturn = xTaskCreate((TaskFunction_t )LED_Task,/* 任务入口函数 */
(const char *)"LED_Task",/* 任务名字 */
(uint16_t )128,
(void *)NULL,
(UBaseType_t )2,
(TaskHandle_t* )&LED_Task_Handle);/* 任务控制块指针 */
if(pdPASS == xReturn)
{
printf("任务创建成功\r\n");

}
vTaskDelete(AppTaskCreate_Handle); //删除 AppTaskCreate 任务
taskEXIT_CRITICAL();//退出临界区

}
//定义一个任务
static void LED_Task(void* parameter)
{
while(1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
printf("开灯\r\n");
vTaskDelay(1000);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
printf("关灯\r\n");
vTaskDelay(1000);
}
}

还有任务的挂起函数和任务的恢复函数

挂起函桉:vTaskSuspend();
恢复函数:vTaskResume();
俩函数都只有一个参数。就是需要操作的任务的句柄

thanks!!!