设为首页 加入收藏

TOP

STM32-FreeRTOS快速学习之总结1(一)
2019-08-27 07:32:34 】 浏览:62
Tags:STM32-FreeRTOS 快速 习之 总结

1. 基础知识
注意:在RTOS中是优先值越高则优先级越高(和ucos/linux的相反)
在移植的时候,主要裁剪FreeRTOS/Source/portable文件夹,该文件夹用来针对不同MCU做的一些处理,如下图所示,我们只需要使用:

 

1.1配置工程时,选择memMang时,一般使用heap_4.c

  • heap_4: 优点在于可以有效的利用内存碎片来合并为一个大内存.缺点在于只能用来一个ram里.
  • heap_5: 一般针对有外部RAM才用到,优点在于可以同时利用内部ram和外部ram来进行内存碎片合并.

最终添加的库文件有:

然后我们在分配释放内存的时候,就尽量使用RTOS带的函数来实现,分配/释放函数如下所示:

void *pvPortMalloc( size_t xWantedSize );    
void vPortFree( void *pv );

1.2 添加头文件路径

  • 添加FreeRTOS\include
  • 添加FreeRTOS\portable\RVDS\ARM_CM3
  • 并将原子中的FreeRTOSConfig.h也复制到我们项目的FreeRTOS\include中(用来配置RTOS系统)

 

2. FreeRTOSConfig.h配置介绍
一般会写configXXXXX或者INCLUDE_XXXX类似的宏,这两个宏区别在于:

  • configXXXXX

用来实现不同功能,比如定义configUSE_COUNTING_SEMAPHORES为1时,表示使用计数信号量

  • INCLUDE_XXXX

用来是否将某个API函数编译进程序中.
比如定义INCLUDE_xTaskGetSchedulerState 为1 时,则将会编译xTaskGetSchedulerState()函数,如下图所示:

 

3. FreeRTOS任务状态

3.1 运行态
指当前任务正在运行.
3.2 就绪态
指当前任务正在等待调度,因为有个高优先级/同优先级的任务正在运行中
3.3 阻塞态
当前任务处于等待外部事件通知或通过vTaskDelay()函数进入休眠了,外部事件通知常见有信号量、等待队列、事件标志组、任务通知.
3.4 挂起态
类似于暂停,表示不会再参与任务调度了,通过vTaskSuspend()实现,重新恢复调度则使用xTaskResume()

 

4. FreeRTOS中断配置

4.1 回忆stm32 NVIC中断
Stm32可以设置NVIC中断组数为0~4,其中0~4区别在于如下图所示:、

比如我们设置为NVIC_PriorityGroup_4时:
表示抢占优先级为4bit(即为2^4,为0~15个抢占优先级),副优先级为0bit(表示没有).

 

4.2 抢占优先级和副优先级的区别:

  • 1. 抢占优先级和副优先级的值越低,则优先级越高
  • 2. 高的抢占优先级的中断可以直接打断低的抢占优先级的中断
  • 3. 高的副优先级的中断不可以打断低的副优先级的中断(只是两个相同抢占优先级的中断同时来的时候,只会优先选择高的副优先级)

 

4.3 FreeRTOS中断配置宏

  • configKERNEL_INTERRUPT_PRIORITY

用来配置中断最低抢占优先级,也就是可以FreeRTOS可以管理的最小抢占优先级,所以使用FreeRTOS时,我们尽量设置stm32为NVIC_PriorityGroup_4,这样就可以管理16个优先级了.

 

  • configMAX_SYSCALL_INTERRUPT_PRIORITY

用来配置FreeRTOS能够安全管理的的最高优先级.比如原子的FreeRTOSConfig.h里就设置为5,而0~4的优先级中断就不会被FreeRTOS因为开关中断而禁止掉(一直都会有),并且不能调用RTOS中的”FromISR”结尾的API函数.比如喂看门狗中断函数就需要设置为0~4

 

  • 如下图所示(来自原子手册):


4.3 FreeRTOS中断开关函数

portENABLE_INTERRUPTS();    
//开中断,将configMAX_SYSCALL_INTERRUPT_PRIORITY至 configKERNEL_INTERRUPT_PRIORITY之间的优先级中断打开

portDISABLE_INTERRUPTS();    
//关中断,将configMAX_SYSCALL_INTERRUPT_PRIORITY至 configKERNEL_INTERRUPT_PRIORITY之间的优先级中断禁止掉

 

 

5.任务常用API函数

5.1 xTaskCreate创建任务函数
定义如下:

xTaskCreate(    TaskFunction_t pxTaskCode,     //任务函数,用来供给函数指针调用的
const char * const pcName,              //任务的字符串别名
const uint16_t usStackDepth,             //任务堆栈深度,实际申请到的堆栈是该参数的4倍
void * const pvParameters,               //函数参数,用来供给指针调用的
UBaseType_t uxPriority,                //优先级,越高优先级高,范围为0~configMAX_PRIORITIES-1 
                            //注意优先级0会创建为空闲任务, 优先级configMAX_PRIORITIES-1会创建一个软件定时器服务任务(管理定时器的)
TaskHandle_t * const pxCreatedTask ); //任务句柄,该句柄可以用于挂起/恢复/删除对应的任务

//返回值 errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY(-1):表示创建任务堆空间不足pdPASS(1):创建成功

 

5.2 taskENTER_CRITICAL()和taskEXIT_CRITICAL()
用于任务中进入/退出临界区,调用taskENTER_CRITICAL()主要会关闭其他任务调度.而taskEXIT_CRITICAL()则会恢复任务调度,一般用于初始化外设等.


5.3 taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()
用于在中断函数中进入/退出临界区,作用和上面一样

 

5.4 挂起/恢复/删除任务函数

void vTaskSuspend( TaskHandle_t xTaskToSuspend );        //挂起一个任务,参数为挂起任务的句柄,如果为NULL则表示挂起自身任务


void vTaskResume( TaskHandle_t xTaskToResume );     //恢复一个任务

BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume);//从中断函数中恢复一个任务,返回1表示恢复成功

void vTaskDelete( TaskHandle_t xTaskToDelete );   //删除一个任务,如果从任务函数中退出的话,则需要调用vTaskDelete(NULL)来删除自身任务

 

5.5 vTaskDelay()延时函数

void
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇linux kernel内存碎片防治技术 下一篇内核线程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目