我在STM32F4发现板上调度了一个带有“delay until”子句的循环,当我增加频率时,该事件停止了时间限制。经过一番挖掘,我认为这是不符合任务的调度程序粒度。其中一个迹象是,当我走得很慢时,大部分时间都受到尊重,而我走得越快,走得越快。但是迟到似乎是离散的,就像落在调度频率限制上一样。我可以改变“延迟,直到”在cortex-m4上的粒度吗?
这里是我的测试代码:
task body PWM is
onPeriod : Time_Span;
offPeriod : Time_Span;
period : Time_Span;
Next_Start : Time := Clock;
PWM_On : Boolean := True;
begin
loop
period := Microseconds (1_000_000)/PWMFrequency;
onPeriod := period/3;
offPeriod := 2 * period/3;
if (PWM_On) then
Off (Pattern (Next_LED));
PWM_On := False;
Next_Start := Next_Start + offPeriod;
else
On (Pattern (Next_LED));
PWM_On := True;
Next_Start := Next_Start + onPeriod;
end if;
delay until Next_Start;
end loop;
end PWM;
我没有显示在示波器的痕迹,这是太复杂了,我只想说,频率越高,越占空比接近33.3%(甚至稳定)。
在蚊蚋分布闲逛之后,我发现,在S-bbbosu.adb:
-- We use the Sys_Tick timer as a periodic timer with 1 kHz rate. This
-- is a trade-off between accurate delays, limited overhead and maximum
-- time that interrupts may be disabled.
Tick_Period : constant Timer_Interval := Clock_Frequency/1000;
(和在一个在S-bbtime.adb称为Delay_Until函数一些连接)
我是否被迫手动使用本地MCU定时器,或者系统中是否提供了更高速度的调度功能? 我是Ada的初学者,所以答案可能很明显。
谢谢,我现在就试试。根据任务需要,是否有更智能的方法来编程可变定时器? (这已经在那里,所以我不必这样做)。 – nraynaud 2014-10-09 21:47:40
我花了45分钟,我无法得到它编译。使用softfp,crt0.o和无法识别的拇指指令,问题会变得无法控制。我会放弃这个重构过程。感谢您的建议。 – nraynaud 2014-10-09 22:36:01