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/TM4C129CNCPDT:时钟模块不能在 TM4C129的 TickMode_DYNAMIC 球型罩中工作

Guru**** 2473260 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/680433/rtos-tm4c129cncpdt-clock-module-does-not-work-in-tickmode_dynamic-dome-on-tm4c129

器件型号:TM4C129CNCPDT

工具/软件:TI-RTOS

您好!

我在 TM4C129 CPU 上的 TI-RTOS 有问题。

我创建简单任务:

#define MS_TO_TICK (x)((x)* 1000 / Clock_tickPeriod) 
静态空 TestTask_Fxn (UARg arg0、UARg arg1) { while (1){ app_info ("%d\n"、Clock_getTicks()); Task_sleep (ms_TO_tick (1000)); } }

它在使用时钟模块配置时工作正常:

bios.cpufreq.lo = 120000000;
clock.tickMode = Clock.tickMode_Periodic;
clock.timerId = 0;
clock.tickSource = Clock.tickSource_timer;

在调试 UART 中、我可以看到消息:

缺省 INF:main:cpufreq.lo 120000000
默认 INF:main:Clock_tickPeriod 100000
默认 INF:TestTask_Fxn:0
默认 INF:TestTask_Fxn:10
默认 INF:TestTask_Fxn:20
默认 INF:TestTask_Fxn:30

默认 INF:TestTask_Fxn:1760
(笑声)

但是、如果我将模式更改为 Clock.tickMode = Clock.tickMode_dynamic;

一段时间后任务停止执行。
调试输出为:

缺省 INF:main:cpufreq.lo 120000000
默认 INF:main:Clock_tickPeriod 100000
默认 INF:TestTask_Fxn:0
默认 INF:TestTask_Fxn:10
(笑声)
默认 INF:TestTask_Fxn:340
默认 INF:TestTask_Fxn:350
默认 INF:TestTask_Fxn:707

默认 INF:TestTask_Fxn:707是我看到的最后一条消息。 在 ROV 中、我看到任务在 Task_sleep (357 (过时数据))上被阻止、但在正常运行中、它显示 Task_sleep (10 (过时数据))。

我使用以下代码添加空闲任务:

UARTprintf ("s %d\n"、Clock_getTicks()); 

获取调试输出:

缺省 INF:main:cpufreq.lo 120000000
默认 INF:main:Clock_tickPeriod 100000
默认 INF:TestTask_Fxn:0
S 0
S 0
(笑声)
S 9.
S 9.
默认 INF:TestTask_Fxn:10
S 10.
(笑声)
S 350
默认 INF:TestTask_Fxn:350
默认 INF:TestTask_Fxn:707
S 708
S 708
(笑声)
S 709.
(笑声)
S 1064
第707节

在我的任务停止执行后、空闲任务继续打印节拍值。 1064之后的下一个值是707、这很奇怪。

我想使用 Clock.tickMode_dynamic 模式来改善功耗、希望在空闲任务中进入睡眠状态。

在空闲状态下添加睡眠:

uint32_t start_ticks = Clock_getTicks ();
UARTprintf ("s %d\r\n"、start_ticks);
SysCtlSleep ();
uint32_t stop_ticks = Clock_getTicks ();
UARTprintf ("%d %d\r\n"、start_dtick、stop_ticks、stop_ticks);sticks 

输出:

[2018-04-13 14:53:51.047]默认值 INF:main:cpufreq.lo 120000000
[2018-04-13 14:53:57.920]默认信息:main:Clock_tickPeriod 100000
[2018-04-13 14:53:57.925]默认值:TestTask_Fxn:0
[2018-04-13 14:53:57.927] s 0
[2018-04-13 14:53:57.928] 0 1
[2018-04-13 14:53:58.018] s 1.
[2018-04-13 14:53:58.018]
[2018-04-13 14:53:58.918]默认信息:TestTask_Fxn:10
[2018-04-13 14:53:58.921] s 10.
[2018-04-13 14:53:58.921] 10 20
[2018-04-13 14:53:59.918]默认信息:TestTask_Fxn:20
[2018-04-13 14:53:59.921] s 20.

[2018-04-13 14:54:31.923]默认信息:TestTask_Fxn:340
[2018-04-13 14:54:31.926] s 340
[2018-04-13 14:54:31.927] 340 707
[2018-04-13 14:54:32.924]默认信息:TestTask_Fxn:350
[2018-04-13 14:54:32.927]默认信息:TestTask_Fxn:707
[2018-04-13 14:54:32.929] s 708
[2018-04-13 14:54:32.930] 708 707
[2018-04-13 14:55:08.625] s 707
[2018-04-13 14:55:08.626] 707
[2018-04-13 14:55:44.418] s 707
[2018-04-13 14:55:44.418] 707
[2018-04-13 14:56:20.211] s 707
[2018-04-13 14:56:20.211] 707

您可以看到 CPU 在空闲任务中休眠并定期唤醒(我认为 time0中断是唤醒源)
但在一段时间(340 - 350个周期)后、时钟模块停止计数。

TI-RTOS 时钟模块有什么问题?
我使用 tirtos_tivac_2_16_00_08

此致、

Michael

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

    Michael、


    遗憾的是、TivaC 器件不支持时钟动态 tickmode 功能。

    犹大

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

    你好,犹大,

    您能否提出一些权变措施、我如何实现类似的行为?

    我想、如果我在模式 Clock.tickSource = Clock.tickSource_user 中配置时钟、我将自行调用 Clock_tick ()。 我可以挂起不必要的中断。

    如何在下一次 CPU 应唤醒时获取信息?

    如何知道 Task_sleep (se_ticke)?

    还是迁移到 MSP432是正确的方式? 我希望用于 MSP432的 TI-RTOS 支持高级电源管理。

    此致、
    Michael

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

    抱歉、对于 TivaC 上的此功能、我没有权变措施或建议。 没有简单的解决方案。

    MSP432对电源管理的支持要好得多、MSP432器件支持动态 tickmode。

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

    谢谢

    此致、
    Michael