freertos的核心---线程与调度

本文深入介绍了FreeRTOS中的线程(任务)结构,包括任务控制块(TCB)的详细组成,任务的创建过程,以及任务如何被添加到就绪列表中。文章强调线程是FreeRTOS管理的基本单元,探讨了任务的生命周期和优先级,并提供了任务创建函数的内部实现,展示了任务栈的初始化和任务状态列表项的作用。此外,还提到了FreeRTOS中的全局列表变量,如就绪、延迟和挂起任务列表,为理解FreeRTOS的任务调度打下基础。
摘要由CSDN通过智能技术生成

一.

划重点,划重点,划重点.

线程就是freertos运行管理的最小单位.一个线程有自己的生命周期,可以是一段时间也可以是forever.

具体看开发人员对于线程的规划,几个线程,每个线程处理什么事情.

先来看看线程长啥样?(任务是线程的别名,为了方便以后都称任务)

typedef struct tskTaskControlBlock             /* The old naming convention is used to prevent breaking kernel aware debuggers. */
{
    volatile StackType_t    *pxTopOfStack;    /*< 任务的桟顶. */

    ListItem_t            xStateListItem;    /*< 任务的状态列表项,表明当前任务所处的状态 */
    ListItem_t            xEventListItem;        /*< 任务的事件列表项,表明当前任务所持有的事件状态 */
    UBaseType_t            uxPriority;            /*< 任务的优先级. */
    StackType_t            *pxStack;            /*< 任务的堆栈. */
    char                pcTaskName[ configMAX_TASK_NAME_LEN ];/*< 任务的名字. */

    #if ( ( portSTACK_GROWTH > 0 ) || ( configRECORD_STACK_HIGH_ADDRESS == 1 ) )
        StackType_t        *pxEndOfStack;        /*< 如果堆栈是先上增长,需要记录堆栈桟底. */
    #endif

    #if ( configUSE_MUTEXES == 1 )
        UBaseType_t        uxBasePriority;        /*< 如果使用锁,记录任务优先级,当优先级反转复原后,恢复之前的优先级. */
        UBaseType_t        uxMutexesHeld;      
    #endif

    #if( configUSE_TASK_NOTIFICATIONS == 1 )
        volatile uint32_t ulNotifiedValue;            /*< 任务的通知数值和状态. */
        volatile uint8_t ucNotifyState;
    #endif

} tskTCB;
typedef tskTCB TCB_t;

哇塞,内容有点多.不要慌,先...自行脑补

 

二.任务的创建.

任务可以静态或者动态创建,静态和动态是内存管理的事情,后面默认都是动态创建.对于主线的理解没有任何影响.

BaseType_t xTaskCreate(    TaskFunction_t pxTaskCode,
                            const char * const pcName,        /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
                            const configSTACK_DEPTH_TYPE usStackDepth,
                            void * const pvParameters,
                            UBaseType_t uxPriority,
                            TaskHandle_t * const pxCreatedTask )
    {
    TCB_t *pxNewTCB;
    BaseType_t xReturn;

      /*判断堆栈的增长方向,一般都是向下增长*/
        #if( portSTACK_GROWTH > 0 )
        {
           
            pxNewTCB = ( TCB_t * ) pvPortMalloc( size

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: FreeRTOS是一个开源的实时操作系统内核,为嵌入式设备提供了实时多任务处理、优先级管理和多线程等功能,非常适合一些资源有限的嵌入式设备进行开发。CANopen则是一种通信协议,可以用于各种嵌入式系统中的控制和数据传输,通常用于工业控制和自动化领域。 STM32F407则是意法半导体生产的一款Cortex-M4内核的微控制器,具有高性能、低功耗、高集成度等特点,非常适合应用于需要高要求的嵌入式设备中。而将这三者结合起来,可以实现很多嵌入式应用的功能,提高设备 控制的精度和可靠性。 具体而言,使用FreeRTOS可以使得STM32F407实现多任务处理,并在任务之间进行调度管理,提高系统的运行效率。CANopen则可以方便地实现各种设备之间的通信,实现控制指令和数据传输功能。在整个开发过程中,通过FreeRTOS和CANopen的结合,可以快速开发出高效、可靠的嵌入式系统。 ### 回答2: FreeRTOS是一个免费的实时操作系统内核,可用于大量基于嵌入式系统的微控制器的开发。CanOpen是针对CAN总线的一个通信协议,它能够实现不同的设备之间的通讯。而STM32F407是由ST推出的基于ARM Cortex-M4微控制器的产品系列之一。 在使用STM32F407进行嵌入式系统的开发时,FreeRTOS和CanOpen是非常有用的工具。FreeRTOS可以提供实时多任务支持,从而可以在单个系统中运行多个任务,并减少系统的复杂性。而CanOpen可实现在CAN总线上的设备之间的通信,从而实现大规模设备的控制和监控。 在使用这些工具时,需要注意一些配置和设置,以确保系统和设备的正常运行。例如,需要在STM32F407上启用CAN总线功能和FreeRTOS支持,这需要了解其软件开发工具,如Keil和IAR等。同时,在设备之间设置正确的CanOpen节点ID,使其互相识别并进行通信。 总之,对于使用STM32F407进行嵌入式系统开发的人员来说,FreeRTOS和CanOpen是非常有用的工具。它们可以帮助优化系统性能,提高设备之间的互操作性,从而实现更好的系统控制和管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值