FreeRtos(1)-----任务创建与管理

freeRTOS实时操作系统移植
以上是历史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!!!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值