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
如何设计计时器、以便这些任务正确运行。
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.
工具/软件: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、
我添加了两个示例任务(任务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
静态变量只初始化一次。
我假设您提供的.cfg 文件片段未包含创建应用程序使用的两个任务所需的语句。 我应该更加关注您关于无法在任务函数上放置断点的评论。
我怀疑这两个任务尚未创建。 您需要在.cfg 文件中具有类似这样的内容:
VAR Task = xdc.useModule('ti.sysbios.knl.Task');
var taskParams = new Task.Params ();
Task.create ('&tsk1Func'、taskParams);
Task.create ('&tsk2Func'、taskParams);
Alan