This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RTOS/CC2640R2F:Task_Entry 始终有效

Guru**** 2595770 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/606595/rtos-cc2640r2f-task_entry-always-works

器件型号:CC2640R2F

工具/软件:TI-RTOS

您好、您能帮您解决下一个问题。 该项目基于 project_zero_cc2640r2lp_app。 添加个人任务后、会出现以下情况:创建所有任务时不会出现错误、但当项目启动时、它们始终处于就绪状态(由点检查)、并且只有 iCall_taskEntry 任务处于运行状态:  

此外、存储器分配图:

这种情况的原因是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Egor、

    您能否发布一些有关如何初始化任务的代码?

    此致、

    Klas
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Klas:

    Task_Structt SCUartTask;
    Char SCUartTaskStack[512];
    
    #define NUMMSGS 5
    
    typedef 结构 MsgObj{
    char str[64];
    }MsgObj;
    
    typedef 结构体 MailboxMsgObj{
    Mailbox_MbxElem; /*邮箱标头 *
    MsgObj OBJ; //应用程序的邮箱*/
    }MailboxMsgObj;
    
    MailboxMsgObj mailboxBuffer[NUMMSGS];
    
    Mailbox_StructMBxStruct;
    Mailbox_Handle mbxUart;
    
    Event_Handle uartEmuEvent;
    
    void scUart_createTask (void)
    {
    Task_Params taskParams;
    Mailbox_Params mbxParams;
    ERROR_Block EB;
    
    /*
    * 配置操作系统任务
    *
    Task_Params_init (&taskParams);
    taskParams.stack = SCUartTaskStack;
    taskParams.STACKSIZE = sizeof (SCUartTaskStack);
    taskParams.priority = 3;//3
    Task_construction (&SCUartTask、SC_uartTaskFxn、&taskParams、NULL);
    
    /*
    * 创建用于等待传感器控制器的信号量
    * 警报事件
    *
    Semaphore_Params semParams;
    Semaphore_Params_init (semParams);
    semParams.mode = Semaphore_Mode_binary;
    Semaphore_construction (semScTaskAlert、0、semParams);
    
    /*构造邮箱实例*/
    Mailbox_Params_init (&mbxParams);
    mbxParams.buf =(ptr) mailboxBuffer;
    mbxParams.bufSize = sizeof (mailboxBuffer);
    mailbox_construct(&mbxStruct, sizeof (MsgObj),NUMMSGS,&mbxParams,NULL);
    mbxUart = Mailbox_Handle (&mbxStruct);
    /*
    * 配置事件接收 UART 数据
    *
    uartEmuEvent = Event_create (NULL、&EB);
    if (uartEmuEvent =NULL){
    log_error0 ("事件创建失败");
    }
    
    } 

    Task_StructUartTask;
    Char UartTaskStack[1024];
    
    void UART_createTask (void)
    {
    Task_Params taskParams;
    
    //配置操作系统任务
    Task_Params_init (&taskParams);
    taskParams.stack = UartTaskStack;
    taskParams.STACKSIZE = sizeof (UartTaskStack);
    taskParams.priority = 3;//3
    Task_construct(&UartTask、uartTaskFxn、&taskParams、NULL);
    } 
    #define LOCK_TASK_PRIORITY 1
    
    #ifndef lock_task_stack_size
    #define LOCK_task_stack_size 1250
    #endif
    
    Task_StructockTask;
    Char lockTaskStack[lock_task_stack_size];
    
    void LockTask_createTask (void)
    {
    Task_Params Params Params;
    
    //配置任务
    Task_Params_init (&taskParams.stack
    );taskParams.stack = lockTaskParams.stack_priority
    = taskparams.params.params_lock_stack
    ;task_lock_params.stack = task_lock_params.params.params.params.params.params.params.
    
    LockSensorTaskFunction、&taskParams、NULL);
    } 
    #define SENSOR_TASK_PRIORITY 1
    
    #ifndef sensor_task_stack_size
    #define sensor_task_stack_size 512
    #endif
    
    Task_StructsnsrTask;
    Char snsrTaskStack[sensor_task_stack_size];
    
    void SensorTask_createTask (void)
    {
    Task_Params taskParams;
    
    //配置任务
    Task_Params_init (&params.stack
    );任务 params.stack = snTaskPriority;
    
    
    
    任务= params.task_sensor_sensor.task_stack_task.s/sensor.params.task= snTask_sensor_sensor_stack;任务= snTask_sensor_sensor.task_stack;任务= SensorsTaskFunction、&taskParams、NULL);
    } 
    #define PRZ_task_priority 1
    
    #ifndef PRZ_TASK_STACK_SIZE
    #define PRZ_TASK_STACK_SIZE 1024
    #endif
    
    Task_StructureprzTask;
    Char przTaskStack[PRZ_task_stack_size];
    
    void ProjectZero_createTask (void)
    
    {
    Task_Params taskParams;
    
    //配置任务
    Task_Params_init (&Params.stack
    );taskParams.stack = przstack;taskTask_params.params_priority
    
    = task.params.task_params.task= task_params.params.task_params.stack;task_parz_params.task= task_params.
    
    WirelessConnectionTaskFunction、&taskParams、NULL);
    } 

    和 main。 C 函数:

    int main()
    {/*
    注册应用程序回调到堆栈中发出的 TRAP 有效状态*/
    RegisterAssertCback (AssertHandler);
    
    PIN_init (BoardGpioInitTable);
    
    #if !defined ( power_saving )//
    设置待机、断电和空闲模式的限制*//
    PowerCC26XX_SB_disallow 可能为 redunders_powercc26XX_disable_disable;
    powercon_disable_disable_power cc26XX_disable_disable_disable_disable_disable_disable_powers/*
    
    #endif // power_saving | use_fpga
    
    #ifdef ICALL_JT
    //更新堆栈的用户配置*/
    user0CInitialize.appServiceInfo->timerTickPeriod = Clock_tickPeriod;user0Cfg.appServiceInfo->timeriseclond
    = iCall_getMaxMs =
    
    
    RTOS *和 RTOS *输出格式化*/空闲线程*。
    *注意:定义 XDC_RAuntime_Log_disable_all 以删除 Log 的所有影响。
    *注意:Params 提供115200、8、N、1和阻塞模式时为空*/
    UART_init ();
    UartLog_init (UART_open (Board_UART0、NULL);
    
    //初始化 iCall 模块*/
    iCall_init ();
    
    //启动外部映像的任务-优先级5 */
    iCall_SensateTasks (* CreateResources*);
    
    
    
    
    
    *任务处理!
    
    
    
    *任务锁源代码(*任务(*);任务处理*任务(*任务0)
    
    
    
    scUart_createTask();
    
    UART_createTask();
    
    /*启用中断并启动 SYS/BIOS */
    BIOS_start();
    
    返回0;
    } 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Egor、

    首先、我要尝试将您自己的自定义任务的优先级从3降低到1。 我还会尝试注释掉所有任务、但一次一个任务除外、并查看它们是否独立于彼此从"正在运行"状态更改。

    请返回您的结果。

    此致、

    Klas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好、Klas。

    将我的任务的优先级设置为1后、没有什么变化:

    但是在删除和添加任务后、获得了以下结果:

    LockTask_createTask 或 ProjectZero_createTask 或 scUart_createTask()已注释掉,程序开始工作


    当我注释 UART_createTask()、 SensorTask_createTask()时、我得到了 Hwi 异常:

    
    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Egor、

    它说的 MEMFAULT 使我有理由相信您已经离开 RAM 了。 您可以在"Memory Allocation"选项卡下查看一下吗? 如果您同时只使用一个自定义任务运行 project_zero 默认任务、它是否按预期工作? 是否有特殊任务不起作用? 您必须将问题片段分解成一个片段、才能在此处找到真正的问题。

    此致、

    Klas
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    您好、Klas。

    最初、ProjectZero_createTask ()、SensorTask_createTask ()、LockTask_createTask ()位于同一个 ProjectZero 项目中、而 scUart_createTask ()、UART_createTask ()位于另一个 ProjectZero 项目中。 在这种情况下、它们可以正常工作。 但必须将它们合并为一个项目。

    感谢 MEMFAULT 的帮助、我尝试尽可能减小任务的大小、尤其是减小任务堆栈的大小。 因此,该方案发挥了作用,但在联系方面存在问题。  

    此外、我启动 UART 任务一次、将数据写入闪存、然后重新启动器件、并且已经只启动任务:ProjectZero、SensorTask、LockTask。

    此外,我使用 Task_create ()而不是 Task_construct()重新创建了所有任务,这释放了一些内存。

    以及我使用 iCall_malloc 选择的 scUart_createTask ()、UART_createTask ()的堆栈。

    这是内存分配的图片:

    此时器件可以工作、但在特定的位置、我还没有弄清楚内存的问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Egor、

    我不确定您是否仍有问题。 您遇到了什么类型的连接问题? 如果您像您说的那样能够释放一些内存、我认为这就是解决方案。

    此致、

    Klas

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    您好 Klas、

    很抱歉、这不是很清楚。 此时问题不会出现、一切都正常。 非常感谢你的帮助。