FreeRTO学习:任务挂起和恢复

 注:在使用大多数功能时,FreeRTOS都要将对应的宏置为1,具体的需要查看FreeRTOS官方文档。

任务的挂起类似于暂停,可进行恢复。

FromlSR后缀的函数是专用于中断的API函数。

任务切换流程图

所有任务只有进入就绪态后才可以进入运行态。

函数基础

任务挂起

1.vTaskSuspend():

1 | void vTaskSuspend(TaskHandle_t xTaskToSuspend)


参数

  • xTaskToSuspend:待挂起的任务句柄。

   当传入参数为NULL时,则为挂起任务自身。

使用步骤:

1.将对应宏置为 1

2.定义函数的入口参数

任务恢复

2.vTaskResume():

void vTaskResume(TaskHandle_t xTaskToResume)

参数

  • xTaskToResume:待恢复任务的任务句柄

任务无论被挂起多少次,只需要任务中调用函数回复一次,则任务进入就绪态。

 任务恢复(中断)

xTaskResumeFromISR():

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume)

参数

  • xTaskToResume:待恢复任务的任务句柄

返回值为pdTRUE表示任务恢复后需要进行任务切换。

注:中断服务函数调用API函数时,中断优先级不能高于FreeRTOS所管理的最高优先级。

FreeRTOSS所管理的优先级范围为5-15,也就是不能管理优先级为0-4的高优先级。

也就是在配置中断时,需要将NVIC分组配置为分组4(全部设置为抢占式优先级),且选择低于4的抢占优先级。

函数的内部实现

函数的内部实现如果需要详细了解,建议查看源码。

任务挂起

注:运行过程中的任务切换是通过触发PendSV的中断进行的

任务恢复

任务恢复(中断)

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MSP-EXP432E401Y Development kit 是德州仪器(TI)推出的一款基于 ARM Cortex-M4F 内核的微控制器开发板,而 FreeRTOS 是一款流行的嵌入式系统实时操作系统(RTOS)。 在 FreeRTOS 环境下,串口回调模式下使用 UART_Callback 需要先进行以下几个步骤: 1. 在 FreeRTOS 中创建一个任务(Task),该任务将被用来接收串口数据并进行处理。 2. 在任务中调用 UART_Callback 函数,该函数将会在串口接收到数据时被调用。 3. 在 UART_Callback 函数中进行数据处理,并将处理结果返回给主程序。 下面是一个示例代码: ```c #include "FreeRTOS.h" #include "task.h" #include "driverlib.h" #define UART_BUFFER_SIZE 256 TaskHandle_t xSerialTaskHandle = NULL; uint8_t ucSerialBuffer[UART_BUFFER_SIZE]; uint32_t ulSerialIndex = 0; void vSerialTask(void *pvParameters) { while (1) { // 等待串口数据 ulTaskNotifyTake(pdTRUE, portMAX_DELAY); // 处理串口数据 if (ulSerialIndex > 0) { // ... } // 清空缓存 ulSerialIndex = 0; memset(ucSerialBuffer, 0, UART_BUFFER_SIZE); } } void UART_Callback(uint32_t ulStatus) { BaseType_t xHigherPriorityTaskWoken = pdFALSE; // 读取数据 while (UARTCharsAvail(EUSCI_A0_BASE)) { ucSerialBuffer[ulSerialIndex++] = UARTCharGetNonBlocking(EUSCI_A0_BASE); // 数据已满,通知任务处理 if (ulSerialIndex >= UART_BUFFER_SIZE) { xTaskNotifyFromISR(xSerialTaskHandle, 0, eNoAction, &xHigherPriorityTaskWoken); break; } } // 通知任务处理 if (ulStatus & EUSCI_A_UART_OE_INTERRUPT_FLAG) { xTaskNotifyFromISR(xSerialTaskHandle, 0, eNoAction, &xHigherPriorityTaskWoken); } portYIELD_FROM_ISR(xHigherPriorityTaskWoken); } void main(void) { // 初始化串口 MAP_UART_initModule(EUSCI_A0_BASE, &(const eUSCI_UART_Config) { .selectClockSource = EUSCI_A_UART_CLOCKSOURCE_SMCLK, .clockPrescalar = 6, .firstModReg = 0, .secondModReg = 0x20, .parity = EUSCI_A_UART_NO_PARITY, .msborLsbFirst = EUSCI_A_UART_LSB_FIRST, .numberofStopBits = EUSCI_A_UART_ONE_STOP_BIT, .uartMode = EUSCI_A_UART_MODE, .overSampling = EUSCI_A_UART_OVERSAMPLING_BAUDRATE_GENERATION }); // 开启串口中断 MAP_UART_enableInterrupt(EUSCI_A0_BASE, EUSCI_A_UART_RECEIVE_INTERRUPT | EUSCI_A_UART_OE_INTERRUPT); MAP_UART_enableModule(EUSCI_A0_BASE); // 创建任务 xTaskCreate(vSerialTask, "SerialTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 1, &xSerialTaskHandle); // 启动调度器 vTaskStartScheduler(); } ``` 在上面的示例中,vSerialTask 函数是任务处理函数,UART_Callback 函数是串口回调函数。当串口接收到数据时,UART_Callback 函数会被调用,将接收到的数据存储到缓存中,并通过 xTaskNotifyFromISR 函数通知任务处理函数处理数据。任务处理函数会在接收到通知时,从缓存中读取数据并进行处理。 需要注意的是,在使用 FreeRTOS 时需要注意任务优先级的设置,以确保任务能够按照预期的方式运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值