在产品开发中遇到一个问题:
使用KEIL环境并开启3级优化,然后创建两个软件定义器并连续启动它们,后启动的软件定时器无法正常运行。
其中方框1处为定时器2的启动函数,方框2内为两个软件定时器的初始化函数,方框3处为两个定时器连续启动操作,调试过程中发现,先启动的定时器1正常运行,后启动的定时器2无法正常运行。
图片发不出来,补上代码
void fun_test(void)
{
uint16_t delay_temp = 1000;
rt_timer_control(&display_symble_blink_timer2_tcb, RT_TIMER_CTRL_SET_TIME, &delay_temp);
rt_timer_start(&display_symble_blink_timer2_tcb);
}
void display_init(void)
{
display_symble_blink_mode = Blink_Mode_NONE;
display_symble_blink_state = 1;
rt_timer_init(&display_symble_blink_timer_tcb, // 显示符号闪烁定时器
"display_symble_blink_timer",
display_symble_blink_timer,
RT_NULL, 1000,
RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
rt_timer_init(&display_symble_blink_timer2_tcb, // 显示符号闪烁定时器
"display_symble_blink_timer2",
display_symble_blink_timer2,
RT_NULL, 1000,
RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
rt_timer_start(&display_symble_blink_timer_tcb);
fun_test();
// uint16_t delay_temp = 1000;
// rt_timer_control(&display_symble_blink_timer2_tcb, RT_TIMER_CTRL_SET_TIME, &delay_temp);
// rt_timer_start(&display_symble_blink_timer2_tcb);
}
这里调用rt_timer_control的设置函数是希望对timer2重新进行参数设置?
keil的优化等级说明如下:
0 近乎不优化,用于调试代码。出现代码行不能设置断点可如此设置试试。
1 部分优化。移除未调用的内联函数和静态函数,关闭debug窗口优化,此状态也能用于调试
2 默认优化等级。如果处于debug状态,部分代码行将不能被调试,具体做了什么优化好像没说
3 等级3
-O0
最少的优化,可以最大程度上配合产生代码调试信息,可以在任何代码行打断点,特别是死代码处。
-O1
有限的优化,去除无用的inline和无用的static函数、死代码消除等,在影响到调试信息的地方均不进行优化。在适当的代码体积和充分的调试之间平衡,代码编写阶段最常用的优化等级。
-O2
高度优化,调试信息不友好,有可能会修改代码和函数调用执行流程,自动对函数进行内联等。
-O3
最大程度优化,产生极少量的调试信息。会进行更多代码优化,例如循环展开,更激进的函数内联等。
另外,可以通过单独设置 --loop_optimization_level=option 来控制循环展开的优化等级。
因为你这里rt_timer_control函数的设置与初始化的内容是重复的,估计这里给cut 了
你可以在 delay_Temp变量前加 volatile可以禁止优化
看代码了,没啥问题,项目里有东西很多吗,有没有未初始化就使用的局部变量?
display_init
这个函数是哪个线程调用执行的,把那个线程栈扩大些啊。目测这俩函数没啥问题,rtt 也没有这方面的特性,优化也不会把这部分优化出问题来
@出出啊
感谢答复!
display_init这个函数是在main线程里调用,用来做显示初始化,所以只会运行一次。main线程的堆栈空间目前是256字节,在调试中看过,还有48个字节的余量。