目录
一、裸机系统简介
1.1、轮询系统
优缺点:
1.2、前后台系统
二、多线程系统
三、对比
一、裸机系统简介
裸机系统可分为轮询系统与前后台系统。
1.1、轮询系统
在裸机编程时,先初始化相关的硬件、而后让主程序在一个循环里不断的执行,依照顺序做各种事情。
int main(void){
// 相关硬件初始化
while(1){
// 处理的事情1
// 处理的事情2
// ...........
// 处理的事情n
}
}
优缺点:
- 能很好按顺序的执行不需要外部事件来驱动的代码。
- 当有外部事件驱动,实时性大大降低。
1.2、前后台系统
在轮询系统的基础上加入中断,外部事件响应的在中断里面完成,事件处理由轮询系统完成,此处中断称为前台,main函数中的死循环称为后台。
unsigned char T10ms;
unsigned char T100ms;
void TIM4_IRQHandler(void)
{
if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update);
ClockTimer1ms(); // 位置标记,
T10ms++;
if(T10ms >= 10)
{
T10ms = 0;
T100ms++;
}
if(T100ms >= 10)
{
T100ms = 0;
}
}
}
unsigned char Clockcount;
unsigned Timer_2ms,Timer_4ms,Timer_8ms;
void ClockTimer1ms(void)
{
Clockcount++;
if((Clockcount %2)==1) // 时间间隔 Clockcount对每两个单位的时间间隔取模的余数只有0或1
{
Timer_2ms=1;
}
if((Clockcount %4)==1) // Clockcount对每两个单位的时间间隔取模的余数有0,1,2,3
{
Timer_4ms=1;
}
if((Clockcount %8)==1)
{
Timer_8ms=1;
}
}
int main(void){
// 硬件初始化部分
LEDInit();
while(){
if(Timer_2ms) // 每2ms中断一次 中断响应事件的标记
{
Timer_2ms = 0;
// 处理事件1
}
if(Timer_4ms)
{
Timer_4ms = 0;
// 处理事件2
}
if(Timer_8ms)
{
Timer_8ms = 0;
// 处理事件 3
}
}
}
事件的响应在中断中,事件的处理在轮询系统(mian函数中的无限循环)中。
二、多线程系统
- 多线程系统的事件响应是在中断中完成的,事件的处理是在线程中完成。
- 线程优先级:优先级高的线程会被优先执行。
int main(void)
{
// 硬件初始化
//OS 初始化
RTOSInit();
//OS 启动,开启多线程调度,不再返回
RTOSStart();
}
// 线程1
void dosomething1(void)
{
while(1)
{
if(Timer_2ms){
// 线程内容1
}
}
}
// 线程1
void dosomething2(void)
{
while(1)
{
if(Timer_4ms){
// 线程内容1
}
}
}
// 线程1
void dosomething3(void)
{
while(1)
{
if(Timer_8ms){
// 线程内容1
}
}
}
三、对比
?
|