裸机系统与多线程系统
Posted 旭日初扬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了裸机系统与多线程系统相关的知识,希望对你有一定的参考价值。
目录
一、裸机系统简介
裸机系统可分为轮询系统与前后台系统。
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
三、对比
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖
以上是关于裸机系统与多线程系统的主要内容,如果未能解决你的问题,请参考以下文章