2014-10-09 33 views
2

我在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的初学者,所以答案可能很明显。

回答

2

您可以通过将更改后的文件放在您自己的代码目录中并使用gnatmake -agprbuild无法识别命令行上的此开关,但可能包括它在GNAT项目文件中)。需要注意的是,库文件重新编译是通过需要严格遵守GNAT编码风格的交换机完成的(例如,编译器警告被视为错误,如C的-Werror)。

所以你可以说

Tick_Period : constant Timer_Interval := Clock_Frequency/10_000; 

你无疑还需要参观这里Tick_Period用于确定蜱数量的地方等待一个给定Duration

+0

谢谢,我现在就试试。根据任务需要,是否有更智能的方法来编程可变定时器? (这已经在那里,所以我不必这样做)。 – nraynaud 2014-10-09 21:47:40

+0

我花了45分钟,我无法得到它编译。使用softfp,crt0.o和无法识别的拇指指令,问题会变得无法控制。我会放弃这个重构过程。感谢您的建议。 – nraynaud 2014-10-09 22:36:01

相关问题