FreeRTOS_vApplicationGetIdleTaskMemory

void vTaskStartScheduler( void )

{

BaseType_t xReturn;

    /* Add the idle task at the lowest priority. */

    #ifconfigSUPPORT_STATIC_ALLOCATION == 1 )

    {

        StaticTask_t *pxIdleTaskTCBBuffer = NULL;

        StackType_t *pxIdleTaskStackBuffer = NULL;

        uint32_t ulIdleTaskStackSize;

        /* The Idle task is created using user provided RAM - obtain the

        address of the RAM then create the idle task. */

        vApplicationGetIdleTaskMemory&pxIdleTaskTCBBuffer, &pxIdleTaskStackBuffer, &ulIdleTaskStackSize );

        xIdleTaskHandle = xTaskCreateStatic(    prvIdleTask,

                                                "IDLE",

                                                ulIdleTaskStackSize,

                                                ( void * ) NULL,

                                                ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),

                                                pxIdleTaskStackBuffer,

                                                pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */

。。。

。。。

}

 

void vApplicationGetIdleTaskMemory(StaticTask_t **ppxIdleTaskTCBBuffer, 

                                                            StackType_t **ppxIdleTaskStackBuffer, 

                                                                     uint32_t *pulIdleTaskStackSize)

{

    *ppxIdleTaskTCBBuffer=&IdleTaskTCB;

    *ppxIdleTaskStackBuffer=IdleTaskStack;

    *pulIdleTaskStackSize=configMINIMAL_STACK_SIZE;

}

vApplicationGetIdleTaskMemory此函数在我们使用静态方法去创建任务的时候会用到,看过原子例程的应该知道,其定义在main.c文件中,其三个参数中有两个参数为二级指针,,,再往上我们看第一个函数vTaskStartScheduler,这是我们在main函数中创建完任务后会调用的函数--实现一个开启任务调度的功能,具体咋实现的,先不管,看里面的代码,

在我们使用静态方法去创建任务后即configSUPPORT_STATIC_ALLOCATION宏定义为1后,下面的代码开始起作用了,可以看到,它先是声明了两个空指针

然后再去调用vApplicationGetIdleTaskMemory这个函数,然后将这两个空指针的地址当作参数传入了进去

再回到vApplicationGetIdleTaskMemory的定义,我们用两个二级指针和一级指针去接收传过来的参数,ok,接着往下

*ppxIdleTaskTCBBuffer=&IdleTaskTCB;

IdleTaskTCB是一个定时器服务任务的控制块,我们将它取地址,赋值给*ppxIdleTaskTCBBuffer,为什么前面要加个*号,

因为如果我们是直接这样写

ppxIdleTaskTCBBuffer=&IdleTaskTCB

那么ppxIdleTaskTCBBuffer中存储的是我们接受到变量的地址即上面提到的空指针的地址,ok,请问地址能等于地址吗?那肯定不行啊,SO

*ppxIdleTaskTCBBuffer就访问的是空指针地址里面的东西,因为是空指针嘛,那自然是啥都没有,这时候,我们将IdleTaskTCB的地址赋值给这块谁都不知道的地方,就相当于把这个IdleTaskTCB赋值给了空指针,完完全全的给了这个空指针,那么你现在操作这个空指针,哦,已经不叫空指针了,你现在操作的就是IdleTaskTCB

至于为什么第二条代码IdleTaskStack没有取地址符,那是因为不需要,IdleTaskStack是个数组,这样写就是表明数组的首地址。

至于第三个,为什么是个一级指针,那是因为configMINIMAL_STACK_SIZ是一个常量,*pulIdleTaskStackSize=常量。即ulIdleTaskStackSize=常量,没毛病。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值