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/SW-EK-TM4C129EXL:调度方法

Guru**** 2482105 points
Other Parts Discussed in Thread: EK-TM4C129EXL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/703823/rtos-sw-ek-tm4c129exl-scheduling-method

器件型号:SW-EK-TM4C129EXL
Thread 中讨论的其他器件:EK-TM4C129EXL

工具/软件:TI-RTOS

我正在使用 EK-TM4C129EXL 套件。 我需要安排两项任务。 让它成为 Task1和 Task2。 计时器应每0.5ms 触发一次中断、并应执行任务1。  计时器应每0.5ms 触发一次中断、并应执行任务2。   

即0.5ms -任务1

   0.5ms -任务2

   0.5ms -任务1

   0.5ms -任务2

如何设计计时器、以便这些任务正确运行。  

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

    创建周期为500us 的单个计时器。

    创建2个信标:信标1、信标2。

    任务1在 sem1上处于循环挂起状态

    tsk1Func (UArg0、UArgarg1)
    {
    while (1){
    Semaphore_pend (sem1、BIOS_wait_forever);
    
    (笑声) /*任务1在此工作*/
    
    }
    }
    
    

    任务2在 sem2上处于循环挂起状态

    tsk2Func (UArg0、UArgarg1)
    {
    while (1){
    Semaphore_pend (sem2、BIOS_wait_forever);
    
    (笑声) /*任务2在此工作*/
    
    }
    
    
    

    在计时器功能中、根据静态计数器发布 sem1或 sem2。

    timerFunc (UArg arg)
    {
    静态 int 计数= 0;
    
    if (count++& 1){
    Semaphore_post (sem2);
    }
    否则{
    Semaphore_post (sem1);
    }
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Alan:
    我是否必须静态地将 timerFunc 配置为周期定时器????.. 代码的其他部分将在何时执行????... 上述代码是如何执行的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以静态或在运行时创建计时器。

    也许第5行的"count++"是模糊的。 'count'是一个静态变量、在应用启动时初始化为零。

    每次 timerFunc 运行时、'count'都会递增。 当"count"为偶数时、将发布"em1"。 当"count"为奇数时、将发布"em2"。

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

    尊敬的 Alan:

          静态 int 计数= 0;  每次触发计时器中断时、在 timerFunc 内声明计数会使计数变为零。 因此、if 语句将每次运行... 因此、我是否必须全局声明 Count、如下所示...

    volatile int count = 0;

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

    Alan、

        我添加了两个示例任务(任务1:使用户 LED0闪烁、任务2:使用户 LED1闪烁)。 然后、我配置了静态计时器和两个信标(二进制计数类型)。 但我仍然无法获得预期的结果。 这两个 LED 在0.5ms 的间隔内不闪烁。  

    即 LED 0 --亮起  0.5ms

       LED 1 -- 关闭 0.5ms

       LED 0 -- 亮起 0.5ms

       LED 1 -- 关闭 0.5ms

       LED 0 -- 亮起 0.5ms

       LED 1 --关闭 0.5ms

    上述突出显示的操作不会运行、而两个 LED 都不会闪烁...     

    代码如下所示

    /* XDCtools 头文件*/
    #include 
    
    /* BIOS 头文件*/
    #include 
    #include 
    #include 
    
    /* TI-RTOS 头文件*/
    
    #include 
    volatile int count = 0;
    extern semaphore_handle sem1;
    extern Semaphore_handle sem2;
    
    // Board Header file */
    #include "Board.h"
    
    
    void timerFunc ()
    {
    //静态 int 计数= 0;
    if (count++& 1){
    Semaphore_post (sem2);/*这部分代码起作用、并且信号量被发布*/
    }
    否则{
    Semaphore_post (sem1);/*这部分代码起作用、并且信号量被发布*/
    }
    }/*Task1
    
    在 sem1*/
    
    tsk1Func (UArg arg0、UArg arg1)
    {上处于暂挂循环中
    while (1){
    Semaphore_pend (sem1、BIOS_wait_forever);//无法在此处设置断点,程序流似乎无法在此处到达*/
    GPIO_TOGGLE (Board_LED0);
    /*任务1在此工作*/
    
    }
    }/*Task2
    在 sem2*/
    
    tsk2Func (UArg0、UArgarg1)
    {上处于暂挂循环中
    while (1){
    Semaphore_pend (sem2、BIOS_wait_forever);//无法在此处设置断点,程序流似乎未到达此处*/
    GPIO_TOGGLE (Board_LED1);
    /*任务2在此工作*/
    
    }
    
    /*
    === main ====
    */
    int main (void)
    {
    //Task_Params 任务 Params;
    /*呼叫板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    
    /*打开用户 LED */
    GPIO_WRITE (Board_LED0、Board_LED_ON);
    GPIO_WRITE (Board_LED1、Board_LED_ON);
    /*启动 BIOS */
    BIOS_start();
    返回(0);
    }
    

    Cfg 文件如下所示。

    /*========================= 应用程序特定实例========================= //
    var semaphore0Params = new semaphore.Params ();
    semaphore0Params.instance.name ="sem1";
    semaphore0Params.mode = semaphore.Mode_binary_priority;
    Program.global.sem1 = semaphore.create (null、semaphore0Params);
    var semaphore1Params = new semaphore.Params ();
    semaphore1Params.instance.name ="sem2";
    semaphore1Params.mode = semaphore.Mode_binary_priority;
    Program.global.sem2 = semaphore.create (空、semaphore1Params);
    var timer0Params = new Timer.Params ();
    timer0Params.instance.name ="timer0";
    timer0Params.period = 5000000;
    timer0Params.startMode = XDC.module ("ti.sysbios.interfaces.ITimer").StartMode_AUTO;
    timer0Params.runMode = XDC.module ("ti.sysbios.interfaces.ITimer").RunMode_DYNAMIC;)
    program.global.timer0 = Timer.create (2、"&timerFunc"、timer0Params); 

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

    关于静态变量初始化、请参阅 Wikipedia 讨论:

       https://en.wikipedia.org/wiki/Static_variable

    静态变量只初始化一次。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我认为 timer0Params.period 设置中有一个太多的零。 它看起来是500万微秒、这将是5秒、而不是0.5秒。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已将500万微秒编辑为50万微秒(即5秒、因为在0.5ms 内无法观察到任何变化)
    tsk2Func 和 tsk1Func 仍然没有运行???? 我不知道为什么
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我假设您提供的.cfg 文件片段未包含创建应用程序使用的两个任务所需的语句。 我应该更加关注您关于无法在任务函数上放置断点的评论。

    我怀疑这两个任务尚未创建。 您需要在.cfg 文件中具有类似这样的内容:

    VAR Task = xdc.useModule('ti.sysbios.knl.Task');
    
    var taskParams = new Task.Params ();
    
    Task.create ('&tsk1Func'、taskParams);
    Task.create ('&tsk2Func'、taskParams); 

    Alan