当前位置:   article > 正文

FreeROTS了解(三)

FreeROTS了解(三)

1、中断

(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);

2、ROTS任务管理

多任务系统同一时刻只能有一个任务可以运行,只是通过调度器的决策,看起来像所有任务同时运行一样。

使用抢占式调度器。

在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    
                        );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

函数描述
函数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();
创建信号量,返回的是一个二值信号量的指针又叫句柄说明创建成功。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/147905
推荐阅读
相关标签
  

闽ICP备14008679号