FreeRTOS
FreeRTOS线程管理TCB线程控制块是操作系统用于管理线程的一个数据结构,它会存放线程的一些信息,例如优先级、线程名称、线程状态等,也包含线程与线程之间连接用的链表结构,线程等待事件集合等,详细定义如下 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253typedef struct tskTaskControlBlock{ // 1. 栈指针 - 最重要的成员之一 // 当任务被切换时,它的当前上下文(寄存器值)就保存在这个栈顶。 volatile StackType_t * pxTopOfStack; // 2. 任务状态链表项 // 用于将TCB插入到不同的状态列表中(如就绪列表、阻塞列表、挂起列表)。 ListItem_t xStateListItem; // 3. 事件链表项 // 用于将TCB插入到事件列表(如队列、信号量)中,当任务因等待事件而阻塞时使用。 ...
面试题
14.FreeRTOS支持哪些类型的中断?中断处理的基本原则是什么?21.FreeRTOS如何处理异常和错误? 24.如何在FreeRTOS中实现低功耗模式?25.FreeRTOS的移植过程通常需要考虑哪些硬件特性? 29.FreeRTOS如何与其他操作系统进行集成?30.FreeRTOS的调试工具和方法有哪些?
FreeRTOS_命名规则
FreeRTOS(1)命名规则1. 命名规则RTOS内核和演示例程源代码使用以下规则: > 变量uint32_t:前缀 ul,u 表示 unsigned,l 表示 long uint16_t:前缀 us,s 表示 short uint8_t:前缀 uc,c 表示 char 非 stdint 类型的变量使用前缀 x,比如基本的 Type_t 和 TickType_t 类型 非 stdint 类型的无符号变量使用前缀 ux,比如 UbaseType_t(unsigned BaseType_t) size_t 类型的变量使用前缀 x 枚举类型变量使用前缀 e 指针类型变量在类型基础上附加前缀 p,比如指向 uint16_t 的指针变量前缀为 pus char 类型变量前缀为 c char * 类型变量前缀为 pc 举例: 12size_t xQueueSizeInBytes;uint8_t * pucQueueStorage; > 函数在文件作用域范围的函数前缀为 prv(一般定义是 static) API 函数的前缀为它们的返回类型,当返回为空时,前缀为...
FreeRTOS_常用API
FreeRTOS(3)常用API==FreeRTOS中任务优先级数值越大,优先级越高,和HAL库相反== 1.创建任务1234567891011121314BaseType_t xTaskCreate( TaskFunction_t pxTaskCode, //任务函数 const char * const pcName, //任务名字 const uint16_t usStackDepth, //任务堆栈大小 void * const pvParameters, //传递给任务函数的参数 UBaseType_t uxPriority, //任务优先级 TaskHandle_t * const pxCreatedTask ) //任务句柄//pxTaskCode : 任务函数 //PCName :...
FreeRTOS_移植
FreeRTOS(0)移植1.在文件根目录下创建Freertos文件夹,把源码拷贝 2.在Keil中创建三个文件夹,分别添加.c和.h 其中port.c 如果用的编译器version5,从RVDS文件夹添加。如果用的version 6,从GCC添加 头文件只用选3个文件夹 3.由于命名冲突,注释掉stm32f4xx_it.c中 void SVC_Handler(void) void PendSV_Handler(void)这两个函数 4.修改systic_Handler函数 12345678910111213void SysTick_Handler(void){ /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); /* USER CODE BEGIN SysTick_IRQn 1 */ ...
FreeRTOS_信号量
FreeRTOS(4)信号量 信号量API函数实际上都是宏,它使用现有的队列机制。这些宏定义在semphr.h文件中。如果使用信号量或者互斥量,需要包含semphr.h头文件。 一、创建信号量 ==二进制信号量==创建实际上是直接使用通用队列创建函数xQueueGenericCreate()。创建二进制信号量API接口实际上是一个宏,定义如下: 123456789#define xSemaphoreCreateBinary() \ xQueueGenericCreate( \ ( UBaseType_t ) 1, \ semSEMAPHORE_QUEUE_ITEM_LENGTH, \ NULL, \ NULL, \ ...
FreeRTOS_任务状态
FreeRTOS(2)任务状态除了运行状态之外的状态统称为非运行状态。因为 FreeRTOS 是为单CPU设计的系统,在任何时刻最多只能允许一个任务处在运行状态,哪怕看起来好像有多个任务同时在运行——这只是多个任务不停地切换带来的效果。当一个任务从运行状态切换到非运行状态时,执行时的现场——CPU寄存器被保存在任务的私有堆栈中;在重新回到运行状态时,再从堆栈中恢复之间保存的寄存器。这是任务调度的最基本功能。 1.就绪的任务 ==FreeRTOS 任务的就绪状态表示任务目前没有被执行,但随时可以被执行。当下一次任务切换时机到来时,FreeRTOS 将从就绪任务的列表中选择优先级最高的任务,切换成运行状态。== 任务优先级是任务的一个属性,FreeRTOS 用整型数表示优先级,最低优先级为0, 最高为 configMAX_PRIORITIES 宏定义的值减去1. 创建任务的时候需要指定一个优先级,在创建之后也可以再通过 vTaskPrioritySet()...







