FreeRtos如何使用

1.创建任务

portBASE_TYPE xTaskCreate(pdTASK_CODE pvTaskCode,const signed portCHAR * const pcName,unsigned portSHORT usStackDepth,void *pvparameters.unsigned portBASE_TYPE uxPriority,xTaskHandle *pxCreatedTask);

函数参数描述:
pvTaskCode:是一个指向任务的实现函数的指针。
pcName:具有描述性的任务名。
usStackDepth:用于告诉内核为它分配多大的栈空间,一般通过定义常量来决定空闲任务的栈空间大小。
pvParameters:接受一个指向void 的指针(void *).pvParameters的值是传递到任务中的值。
uxPriority:任务执行优先级
pxCreatedTask:用于传出任务的句柄。
返回值:1.pdTRUE创建成功。2.errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
内存堆空间创建不足

2.启动调度器,任务开始执行

vTaskStartScheduler();
for(;;);

2.1停止实时内核运行

void vTaskEndScheduler ( void )

3.挂起和唤醒

挂起:vTaskSuspend(); 让一个任务进入挂起状态
唤醒:vTaskResume()vTaskResumeFromISR();  唤醒任务

FreeRTOSConfig.h 中的INCLUDE_vTaskSuspend 为1

4.切换任务

taskYIELD()

通知调度器现在就切换到其他任务,而不必等到本任务的时间片耗尽。

5.阻塞态实现延迟

void vTaskDelay(portTickType xTicksToDelay);

函数形参描述:
xTicksToDelay:延迟多少个心跳周期。
常数portTICK_RATE_MS用来将毫秒为单位的时间值转换为以心跳周期为单位的时间值
说明:FreeRTOSConfig.h 中的INCLUDE_vTaskDelay=1,这个函数才能用

void vTaskDelayUntil(portTickType * pxpreviousWakeTime,portTickType xTimeIncrement);

函数形参描述:
pxpreviousWakeTime:保存了任务上一次离开阻塞态(被唤醒)的时刻,。这个时刻被用作一个参考点来计算该任务下一次离开阻塞态的时刻。只需第一次将其初始化,之后将自动更新(xLastWakeTime = xTaskGetTickCount())。
xTimeIncrement:用于实现某个任务以固定频率周期性执行,常量portTICK_RATE_MS将毫秒转换为心跳周期。
说明:FreeRTOSConfig.h 中的INCLUDE_vTaskDelayUntil=1,这个函数才能用

6.空闲钩子函数

void vApplicationIdleHook(void);

7.任务优先级

改变优先级

void vTaskPrioritySet(xTaskHandle pxTask,unsigned portBASE_TYPE uxNewPriority);

函数参数描述:
pxTask:任务句柄。
uxNewPriority:任务优先级设置

查询优先级

 unsigned portBASE_TYPE uxTaskPriorityGet(xTaskHandle pxTask);

pxTask:被查询任务的句柄。

8.删除任务

void vTaskDelete(xTaskHandle pxTaskToDelete);

pxTaskDelete:被删除的任务句柄。
说明:FreeRTOSConfig.h 中的INCLUDE_vTaskDelete=1,函数才能使用

9.队列管理

9.1队列创建

xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize ); 

函数参数描述:
uxQueueLength:队列能够存储的最大单元数目
uxItemSize:队列中数据单元的长度。
返回值:NULL表示没有足够的堆空间分配给队列,非NULL表示队列创建成功,返回值为队列的句柄。

9.2发数据

xQueueSendToFront:用于将数据发送到队列首。

portBASE_TYPE xQueueSendToFront( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait ); 

xQueueSendToBack:用于将数据发送队列尾。
xQueueSend()完全等同于xQueueSendToBack().

portBASE_TYPE xQueueSendToBack(  xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait ); 

函数形参描述:
xQueue:队列的句柄;
pvltemToQueue:发送数据的指针,指针指向将要复制到目标队列中的数据单元。
xTicksToWait:阻塞超时时间。若队列时间已满,这个时间即是任务处于组赛态等待队列空间有效的最长等待时间。若设置为1,将会立即返回。如果把 xTicksToWait 设置为 portMAX_DELAY ,并且在FreeRTOSConig.h 中设INCLUDE_vTaskSuspend 为 1,那么阻塞等待将没有超时限制

返回值:1.pdPASS数据成功发送到队列。2.errQUEUE_FULL队列已满,数据无法写入。

9.3收数据

接收到的单元会从队列中删除:

portBASE_TYPE xQueueReceive( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait );

接收到的单元不会从队列中删除:

portBASE_TYPE xQueuePeek( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait ); 

函数参数描述:
xQueue:被读队列的句柄。
pvBuffer:接收缓存指针。
xTicksToWait:阻塞超时时间(超时时间设置如发送一样)

返回值:1.pdPASS成功从队列中读到数据。2.errQUEUE_FULL队列已空没有读到数据。

9.4查询队列中当前有效数据单元个数

unsigned portBASE_TYPE uxQueueMessagesWaiting(xQueueHandle xQueue);

函数参数描述:
xQueue:被查询队列的句柄。
返回值:当前队列保存的数据单元个数,0表明队列为空。

10.中断

从中断唤醒挂起的任务

portBase_TYPE vTaskResumeFromISR (xTaskHandle pxTaskToResum 就绪任务的句柄)

说明:FreeRTOSConfig.h 中的INCLUDE_vTaskSuspendhe 和INCLUDE_xTaskResumeFromISR 都为1,才能使用此函数。

10.1创建二值信号量

void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore ); 

函数参数描述:
xSemaphore:创建的信号量

10.1.1获取或接收信号量

不能在中断服务函数中被调用。

portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait ); 

函数参数描述:
xSemaphor:获取得到的信号量
xTicksToWait:阻塞超时时间。任务进入阻塞态以等待信号量有效的最长时间。(与9.2里面发数据一样)

返回值:1.paPASS成功 2.pdFALSE未获得信号量

10.1.2给信号量

portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore, portBASE_TYPE *pxHigherPriorityTaskWoken ); 

函数参数描述:
xSemaphore:给出的信号量
pxHigherPriorityTaskWoken:解除之前为pdFALSE,解除阻塞之后会设置为pdTRUE。

返回值:1.pdPASS调用成功,2.pdFALL如果信号量已经有效,无法给出,则返回pdFAIL。

10.1.3main()函数编写流程

创建二值信号量以及任务→安装中断服务例程,然后启动调度器

安装中断例程
_dos_setvect(0x82,vExampleInterruptHandler);

10.2计数信号量

10.2.1创建计数信号量

xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount ); 

函数参数描述:
uxMaxCount:最大计数值。
uxInitialCount:信号量的初始计数值。事件计数(0),资源管理(uxInitialCount == uxMaxCount)

返回值:NULL堆上内存空间不足,非NULL信号创建成功。

10.3在中断服务例程中使用队列

10.3.1发送队列消息

加在队首:

portBASE_TYPE xQueueSendToFrontFromISR( xQueueHandle xQueue, void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken );

加在队尾:

portBASE_TYPE xQueueSendToBackFromISR( xQueueHandle xQueue, void *pvItemToQueue portBASE_TYPE *pxHigherPriorityTaskWoken )

xQueue:目标队列的句柄。
pvltemToQueue:发送数据的指针。
pxHigherPriorityTaskWoken:从pdFALSE转换到pdTRUE。
返回值:1.pdPASS 2.errQUEUE_FULL

10.3.2接收队列消息

portBASE_TYPE xQueueReceiveFromISR (
xQueueHandle pxQueue, //发送项目的队列句柄
void *pvBuffer, //指向缓冲区的指针,将接收的项目被复制进去
portBASE_TYPE *pxTaskWoken //任务将锁住,等待队列中的可用空间
);

返回值:pdTRUE成功接收,pdFALSE失败

10.3.3为队列命名,加入队列到登记管理中

void vQueueAddToRegistry (
xQueueHandle xQueue, //将要添加登记的队列句柄
signed portCHAR *pcQueueName, //为指定的队列命名。 仅仅是文本串,方便调试。
);

10.3.4从登记管理中一出队列

void vQueueUnregisterQueue (
xQueueHandle xQueue, //从登记管理处中移出的队列句柄
);

10.4中断嵌套
建立一个全面的中断嵌套模型需要设置configMAX_SYSCALL_INTERRUPT_PRIRITY=3
为比configKERNEL_INTERRUPT_PRIORITY=1更高的优先级。

11.资源管理

11.1临界区

taskENTER_CRITICAL();//进入临界区
POPTA | = 0x01taskEXIT_CRITICAL();//退出临界区

11.2挂起和唤醒所有活动的实时内核,同时允许中断

void vTaskSuspendAll(void);

通过调用 vTaskSuspendAll()来挂起调度器。挂起调度器可以停止上下文切换而不
用关中断。如果某个中断在调度器挂起过程中要求进行上下文切换,则个这请求也会被
挂起,直到调度器被唤醒后才会得到执行

portBASE_TYPE xTaskResumeAll( void );

返回值:在调度器挂起过程中,上下文切换请求也会被挂起,直到调度器被唤醒后才会得到执行。如果一个挂起的上下文切换请求在xTaskResumeAll()返回前得到执行,则函数返回 pdTRUE。在其
它情况下,xTaskResumeAll()返回 pdFALSE。

11.3互斥量

11.3.1创建互斥锁信号量

xSemaphoreHandle xSemaphoreCreateMutex( void ); 

返回值:NULL创建失败 非NULL创建成功
说明:可以使用xSemaphoreTake() 与 xSemaphoreGive() 宏来访问

11.3.2递归互斥锁

xSemaphoreHandle xSemaphoreCreateRecursiveMutex ( void )

说明:通过此宏创建的互斥锁可以使用xSemaphoreTakeRecursive()与 xSemaphoreGiveRecursive()

11.4守护任务

守护任务即为将受到的信息写在标准输出上。中断服务例程中可以安全地使用守护任务提供的服务。使用心跳中断钩子函数用于每200心跳周期输出一个消息。配置如下:
设置 FreeRTOSConfig.h 中的常量configUSE_TICK_HOOK 为 1。

11.5栈溢出

查询指定任务的运行历史中,栈空间还有多少就要溢出。

 unsigned portBASE_TYPE uxTaskGetStackHighWaterMark( xTaskHandle xTask ); 

函数参数描述:
xTask:任务的句柄

返回值:返回从任务启动执行开始的运行历史中,栈空间具有的小剩余量。这个值即是栈空间使用达到深时的剩下的未使用的栈空间。

11.5.1栈溢出钩子函数

在FreeRTOSConfig.h中把configCHECK_FOR_STACK_OVERFLOW设为1或2
钩子函数具体实现:

void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTaskName ); 
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值