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:使用相同的函数创建不同的任务

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/569901/rtos-creating-different-task-with-same-function

Thread 中讨论的其他器件:SYSBIOS

工具/软件:TI-RTOS

大家好、

我有以下类,只要它实现了 Run()函数,它的任何子类都可以运行。

在 SYS/BIOS 中创建任务时、我必须附加静态类函数(与 POSIX API 相同)、因此我使用了静态类函数

函数技巧。 这种方法的问题在于、在运行时、所有任务基本上都具有相同的函数

嗯 (我认为是意外的)、当我创建 了更多的子应用程序崩溃时。

我认为任务堆栈存在问题 、但我不知道如何处理。

====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

类 ActiveCls{
   专用:
 
       Task_Params taskParams;
       Task_handle taskLa;
       ERROR_Block EB;
 
   受保护:
 
       void attach (void*(* tsk_fxn)(void* arg)、int priority){
 
           ERROR_INIT (&EB);
 
           Task_Params_init (&taskParams);
           taskParams.priority = priority;
           taskParams.STACKSIZE = 0x100000;
           taskParams.arg0 =(UArg)此;
 
           taskLa = Task_create (ActiveCls::__run、_taskParams、&EB);
           if (taskLa ==空)
           {
               System_printf ("任务创建()失败!\n"\});
               BIOS_exit (0);
           }

/*    pthread API 也是如此-但在 Windows 7下运行良好!!    *
       }
 
 
       虚拟 void* Run(){
 
           log
                   "警告.. 此类未实现 run()函数。\n");
           返回0;
       }
 
       ActiveCls (int pri){
           附加(&ActiveCls::run、pri);
       }
 
       ActiveCls(){
           log ("警告.. 未设置类优先级,默认为优先级1。\n");
           attach (&ActiveCls::run、1);
       }
 
       静态空_run (UARg a0、UARg A1){
 
           (((ActiveCls*) a0)->Run();
       }
 
};


类 AnExampleChild:公共 ActiveCls {

公共:
   void* Run()   {
   日志("嘿!、我正在运行。。。\n")
   }
};

====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

此致、

餐巾温泉

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

    乍一看、我看不到您上面发布的代码有什么问题。 您的开发目标是什么器件? 您能否发布从崩溃中获得的输出的屏幕截图? 由于您提到创建子级导致崩溃、我认为可能是堆用尽。 碰撞输出有助于确定发生了什么。 此外、您使用的是哪个编译器和 SYSBIOS 版本?

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

    您好、Emmanuel、

    没有堆崩溃、因为我之前遇到过堆崩溃、日志消息指示如果发生了堆崩溃。 我提供了64 MB 堆。 器件为6678、BIOS 版本为6.46.00.23。 C6000编译器为8.1.1。 请注意
    此版本中已存在复制分配错误。
    当我尝试调试内核时,我已经看到任务创建在 pthread.c 中使用 Memory_alloc(),从而使堆足够大,并在那里输入中断,这是安全的(我用-o 0重新编译内核)。

    此外,当我以传统方式在 main()函数中创建任务时,不会发生崩溃。 (我为它们分配了完全相同的子函数和优先级、也分配了相同的堆栈存储器、所有这些都与我的第一个帖子中的相同)。

    我还在这里附加了类的 POSIX 版本 -- e2e.ti.com/.../1323.ActiveCls.h (我尝试了其他版本以确保它不是 POSIX API 错误)。 但也发生了同样的事情。

    如果您希望我也可以添加.pp 文件来尝试它。

    此致、

    餐巾温泉

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Emmanuel、
    你能找到什么吗? 或者有什么建议、为什么会发生这种情况?

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

    我还附加了一些用于调试的捕获。

    e2e.ti.com/.../3580.bug.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我发现了一些与任务创建无关的奇怪东西,并在这里找到了一个新的主题:
    e2e.ti.com/.../571322