基于FreeRtos的快速入门学习(韦东山)

本文介绍了FreeRTOS中的关键函数,如动态任务创建(xTaskCreate),静态任务创建(xTaskCreateStatic),任务删除(vTaskDelete)和延迟函数(vTaskDelay/vTaskDelayUntil)。还讨论了TickType_t和BaseType_t数据类型,任务状态及切换,以及在软件仿真中的注意事项。
摘要由CSDN通过智能技术生成

1.常见的FreeRtos函数

1.1 xTaskCreate函数,动态创建任务。

BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
                            const char * const pcName, 
                            const configSTACK_DEPTH_TYPE usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask )

       其中pxTaskCode为任务函数,pcName为任务名字, usStackDepth为栈的深度,pvParameters为参数,uxPriority为任务的优先级, pxCreaterdTask为任务的handle。handle中可以为NULL, 参数为空时pvParameters也可以为空。

         在创建一个任务,每个任务使用TCB_t结构体进行描述,在使用上述函数时采用动态内存分配内存给结构体,采用malloc,handler用于指向该结构体的指针 TaskHandle_t *,栈用于保存函数返回的地址和变量等。

1.2 xTaskCreateStatic函数,静态创建任务。

    TaskHandle_t xTaskCreateStatic( TaskFunction_t pxTaskCode,
                                    const char * const pcName, /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                                    const uint32_t ulStackDepth,
                                    void * const pvParameters,
                                    UBaseType_t uxPriority,
                                    StackType_t * const puxStackBuffer,
                                    StaticTask_t * const pxTaskBuffer )

       静态任务就是要事先分配好TCP以及栈。其中通过定义 一个静态数据传入到函数参数作为这个静态函数的一个栈,这个数组的个数与ulStackDepth相同,且每一位大小为4.

        要使用该函数创建静态任务首先需要使能#define configSUPPORT_STATIC_ALLOCATION 1,其次由于要调用该函数需要给空闲任务定义  空闲任务PCB,空闲栈以及栈大小,使用如下函数定义。

void vApplicationGetIdleTaskMemory( StaticTask_t ** ppxIdleTaskTCBBuffer, StackType_t ** ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize )

1.3 vTaskDelet

    该函数通过任务句柄删除相应的任务,如果要删除任务自身只需要在自身任务中传入NULL便可。

1.4 vTaskDelay

           该函数可以让任务从执行该语句处延时一定的时间。 可以保证任务的休息时间一致,但不能保证执行的任务是否周期性运行,因为任务执行语句每一次执行的时间可能不一致。    

1.5 vTaskDelayUntil

         该函数可以让执行从指定的时间点延时设定的时间,达到周期性执行的效果。可以在任务开始前记录任务的开始时间,然后执行函数延时相应的毫秒。

2. 数据类型

TickType_t: Freertos中配置了一个周期性的时钟中断:Tick Interrupt,每发生一次中断中断次数会累加被称为tick count,这个变量的类型便为TickType_t。对于32位架构建议设置为32位。

BaseType_t:该架构最高效的数据类型,如果是32位架构则为uint32_t,如果是16位则为uint16_t.这种数据类型通常用作简单的返回值的类型,还有逻辑值,比如pdTrue/pdFalse等。

3.同一个函数被多个任务调度

   使用同一个函数创建多个任务的时候,由于享用的栈区并不相同,所以他们运行的效果并不回同步。

4.当任务里面的局部变量较多超过了栈大小

        由于变量太多破坏了栈头也就是pcb等,这样会让程序崩毁,陷入hardFault中。

5.FreeRtos任务状态及切换

     

     FreeRtos中任务切换的基准时间为1ms,每1ms切换一次。

     任务状态可以分为:运行态,就绪态,阻塞态,暂停态。

        运行态:任务被cpu运行的时候的状态。

      就绪态:任务可以运行,在优先级轮到他的时候按顺序执行。

      阻塞态:任务被某些事件阻塞,比如取二值变量没有可取的变量,此时需要等待该变量可以获取才会停止阻塞。

        暂停态:任务主动或被动休息。

6. 在用软件仿真停滞

    在修改了芯片型号的时候,跟着卫东山freertos测试软件仿真总是停留在以下界面

需要修改如下界面:

将Dialog DLL更改为DARMSTM.DLL, Parameter更改为对应的型号。

  • 23
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值