当前位置: 首页 > 工具软件 > FreeRTOS > 使用案例 >

freeRTOS-简介和应用

琴宾鸿
2023-12-01

1.什么是FreeRTOS?

  1. Free 即免费的,RTOS 全称是 Real Time Operating System,中文就是实时操作系统。注意,RTOS 不是指某一个确定的系统,而是指一类系统。比如 uC/OS,FreeRTOS,RTX,RT-Thread 等这些都是 RTOS 类操作系统.

2.FreeRTOS资料与源码下载

要找资料,官网是最好的地方,FreeRTOS的官网是www.freertos.org

FreeRTOS-Plus  文件夹

 CLI、FAT、Trace 等等。就系统本身而言,和 FreeRTOS里面的一模一样的,所以我们如果只是学习 FreeRTOS 这个系统的话,FreeRTOS-Plus 就没必要看了。

3.任务的概念

一个任务其实就是一个函数+控制块。调度程序根据CPU的时间片,去分配给不同的任务。比如当前三个任务。ble任务,app_task1任务,app_task2任务。来回的入栈出栈切换。

时间片1               ble任务 入栈---执行---同步任务控制块状态-----出栈

时间片2               app_task1任务 入栈---执行---同步任务控制块状态-----出栈

时间片3               app_task2任务 入栈---执行---同步任务控制块状态-----出栈

时间片4               app_task1任务 入栈---执行---同步任务控制块状态-----出栈

4.创建一个任务,使用静态栈区

函数xTaskCreateStatic形式如下

TaskHandle_t xTaskCreateStatic(TaskFunction_t pxTaskCode, const char *const pcName, const <error-type> ulStackDepth, void *const pvParameters, UBaseType_t uxPriority, <error-type> *const puxStackBuffer, StaticTask_t *const pxTaskBuffer)

调用的函数形式。看着好复杂。

入参(任务函数,任务名字,任务栈区大小,任务函数入参,任务优先级,栈指针,任务控制块指针)

1.调用的循环任务

//任务1----

#define TASK1_NAME "app1"

#define TASK1_STACK_SIZE 200 //栈区大小

#define TASK1_PRIORITY configTIMER_TASK_PRIORITY-2 //第二优先级

static StackType_t app_task1_stack[TASK1_STACK_SIZE];//任务栈全局静态变量

static StaticTask_t app_task1_buf;//任务控制块

static void app_task1(void *param)

{

    while(1)

    {

       //任务

        ulTaskNotifyTake(pdTRUE,portMAX_DELAY);

    }

}

   

2.传参 

(任务入口函数,任务名字,任务栈区大小,任务函数入参,任务优先级,栈指针,任务控制块指针)

 xTaskCreateStatic(app_task1,TASK1_NAME,TASK1_STACK_SIZE,NULL,TASK1_PRIORITY,app_stack1,&app_task1_buf);

3. 启动调度

   vTaskStartScheduler();

5.创建一个任务,使用动态栈区

xReturn = xTaskCreate(    (TaskFunction_t )AppTaskCreate,         /*任务入口函数 */
                            (const char* )"AppTaskCreate",            /* 任务名字 */
                            (uint16_t )512,                         /* 任务栈大小 */
                            (void* )NULL,                            /* 任务入口函数参数 */
                            (UBaseType_t )1,                         /* 任务的优先级 */
                            (TaskHandle_t* )&AppTaskCreate_Handle);    /* 任务控制块指针 */
 

1.调用的循环任务

//任务1----

#define TASK2_NAME "app2"

#define TASK2_STACK_SIZE 200 //栈区大小

#define TASK2_PRIORITY configTIMER_TASK_PRIORITY-2 //第二优先级

static StaticTask_t app_task2_buf;//任务控制块

static void app_task2(void *param)

{

    while(1)

    {

       //任务

        ulTaskNotifyTake(pdTRUE,portMAX_DELAY);

    }

}

   

2.传参 

(任务入口函数,任务名字,任务栈区大小,任务函数入参,任务优先级,栈指针,任务控制块指针)

 xTaskCreateStatic(app_task2,TASK2_NAME,TASK2_STACK_SIZE,NULL,TASK2_PRIORITY,&app_task1_buf);

3. 启动调度

   vTaskStartScheduler();

6.  任务通知

#define xTaskNotifyGive( xTaskToNotify ) 	xTaskGenericNotify( ( xTaskToNotify ), ( 0 ), eIncrement, NULL )

     1.ulTaskNotifyTake(pdTRUE,portMAX_DELAY);

                pdTRUE,这导致接收任务的通知值在ulTaskNotifyTake()返回之前被清除为零

     2.xTaskNotifyTake

     2.xTaskNotifyGive( xTask2 );

                用于向一个任务发送通知,并将对方的任务通知值加 1

     3.xTaskNotify

     4.xTaskNotifyWait

 类似资料: