赞
踩
(1)先优先级分组。3位作为抢占优先级,1位作为子优先级。0-7是抢占优先级的数值,0-1是子优先级的数值。
NVIC_SetPriorityGrouping(4);
(2)再编码优先级
pri0 = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 4, 0);
(3)再设置中断任务的优先级。IRQn表示中断号,由MCU决定。pri0 值域 0~15 根据前述分组,决定哪些位是抢占优先级,哪些位是子优先级。数值越低,优先级越高
NVIC_SetPriority(IRQn,pri0);
(4)以上中断配置后,相应中断使能的情况下才能使用
NVIC_EnableIRQ(IRQn);
多任务系统同一时刻只能有一个任务可以运行,只是通过调度器的决策,看起来像所有任务同时运行一样。
使用抢占式调度器。
在RTOS下,每个任务都有自己的栈空间。对于FreeRTOS来说,任务栈空间是在任务创建的时候从FreeRTOSConfig.h文件中定义的heap空间中申请的。具体每个任务的栈大小是在创建FreeRTOS的任务时进行设置的。
由于等待信号量,消息队列,事件标志组等而处于的状态被称之为阻塞态,另外任务调用延迟函数也会处于阻塞态。
Suspended—挂起态,类似阻塞态,通过调用函数vTaskSuspend()对指定任务进行挂起,挂起后这个任务将不被执行,只有调用函数xTaskResume()才可以将这个任务从挂起态恢复。
使用如下函数即可启动FreeRTOS,vTaskStartScheduler();用于启动FreeRTOS调度器,即启动FreeRTOS的多任务执行。
使用这个函数要注意以下几个问题:
1、 空闲任务和可选的定时器任务是在调用这个函数后自动创建的。
2、正常情况下这个函数是不会返回的,运行到这里极有可能是用于定时器任务或者空闲任务的heap空间不足造成创建失败,此时需要加大FreeRTOSConfig.h文件中定义的heap大小:
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 17 * 1024 ) )
函数原型:
BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode,
const char * const pcName,
unsigned short usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pvCreatedTask
);
函数描述:
函数xTaskCreate用于实现FreeRTOS操作系统的任务创建,并且还可以自定义任务栈的大小。
u 第1个参数填创建任务的函数名。
u 第2个参数是任务名,这个参数主要是用于调试目的,调试的时候方便看是哪个任务。
u 第3个参数是任务栈大小,单位word,也就是4字节。
u 第4个参数是创建的任务函数的形参。
u 第5个参数是任务优先级。
u 第6个参数是任务句柄,用于区分不同的任务。
pxTaskCode : 实现任务的主要功能的函数,其返回值是void 类型,参数是void * 类型
const pcName:任务名,长度由宏 configMAX_TASK_NAME_LEN (FreeRTOSConfig.h)决定
StackDepth : 堆栈的大小设置。实际大小是该值4倍,因为它是4字节大小。
pvParameters :需要传递给任务的参数,
uxPriority : 任务优先级,范围:0-configMAX_PRIORITIES(FreeRTOSConfig.h)
pxCreatedTask :创建成功后的任务句柄保存在这个参数里面,供其他API 使用。
创建成功后,返回值为: pdPASS. 其他则为失败,可能的原因堆内存分配失败。
任务删除:
vTaskDelete();
如果用往此函数里面填的任务ID是NULL,即数值0的话,那么删除的就是当前正在执行的任务,此任务被删除后,FreeRTOS会切换到任务就绪列表里面下一个要执行的最高优先级任务。
pvPortMalloc是从configTOTAL_HEAP_SIZE中申请内存,
malloc是直接从SRAM 堆 中申请内存,是和全局变量一个地位
xSemaphoreCreateBinary();
创建信号量,返回的是一个二值信号量的指针又叫句柄说明创建成功。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。