当系统响应时间很重要时,要使用抢占式内核。因此绝大多数商业上销售的实时内核都是抢占式内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。
如果是中断服务程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务将被挂起,优先级高的那个任务开始运行。
11. 中断
中断是一种硬件机制,用于通知CPU有个异步事件发生了。中断一旦被识别,CPU保存部分(或全部)上下文即部分或全部寄存器的值,跳转到专门的子程序,称为中断服务程序(ISR)。中断服务程序做事件处理,处理完成后,程序回到:
1.在前后台系统中,程序回到后台程序;
2.对非抢占式内核而言,程序回到被中断了的任务;
3.对抢占式内核而言,让进入就绪态的优先级最高的任务开始运行。
12. 时钟节拍
时钟节拍是特定的周期性中断。这个中断可以看作是系统心脏的脉动。中断之间的时间间隔取决于不同应用,一般在10ms到200ms之间。时钟的节拍式中断使得内核可以将任务延时若干个整数时钟节拍,以及当任务在等待事件发生时,提供等待超时的依据。
时钟节拍率越快,系统的额外开销就越大。
5 硬件设计
Vin_Pot 输入电压同时送入上下两路 SAR ADC。SAR ADC 0 设为 12 位分辨率,2.048V 的固定 量程,将它作为 SAR ADC 1 的测量结果准确性对照。SAR ADC 1 设为 8 位分辨率,输入范围设为 0~2.048V。
为了尽量实现准确的测量,应让 Vin_Pot 的变化范围与 SAR ADC 1 的输入范围尽量匹配,为此 使用了两个可编程增益放大器 PGA_1 和 PGA_2 对小输入电压进行放大。针对 Vin_Pot 的不同变化 范围(3 个量程),两个 PGA 的增益设置如上图所示,2000mV 量程时总增益为 1,200mV 量程时总增益为 8,20mV 量程时总增益为 96。
200mV 量程时这里将总增益安排为 8 而不是 10(因为 PGA 并没有 1x10 或者 2x5 的增益配置可选),此时Vin_Pot范围在0~256mV时与SAR ADC 1的输入范围刚好匹配,但程序只处理0~200mV的范围,即使用了 SAR ADC 1 的 80% F.S.。
20mV 量程时将总增益安排为 96 而不是 100,此时 Vin_Pot 范围在 0~21.3mV 时与 SAR ADC 1的输入范围刚好匹配,但程序只处理 0~20mV 的范围,即使用了 SAR ADC 1 的 94% F.S.。这样可以让 20mV 和 200mV 量程之间有一个重叠(20~21.3mV),当使用自动量程测量时,避免被测电压出现在相邻量程的交界处时显示结果跳动频繁。如上所述 200mV 和 2000mV 量程之间也有重叠(200~256mV)。
按键状态通过 D 触发器,每隔 20ms(1/50Hz)采样一次,q 为硬件消抖后的输出,提供给中断。中断的触发类型设为上升沿触发。按键的每次按下时刻,触发一次中断。
5.1 ADC
5.2 时钟
5.3 PGA
6 软件设计
6.1 总体设计
app.c 中定义了:#define DISPHOLD_STATUS() (LED4_Read()==1)
通过 DISPHOLD_STATUS()
可知当前的显示保持状态,当值为 0(DEF_FALSE)
时, 任务正常 进行测量和结果显示;当值为 1(DEF_TRUE)
时,不进行测量和结果显示。
App_TaskADC12()
是第一个创建的用户任务,负责通过 SAR ADC 0(12 位分辨率)测量输 入电压及结果显示,以及 SW2 显示保持按键事件的处理。当前的显示保持状态由 LED4 指示。在非显示保持状态时,进行测量电压、过