现在我遇到的嵌入式程序,基本都是在main函数里面用一个while(1),循环去执行我们所写的程序,如果不加以处理就会出现浪费cpu资源的现象。
举个例子:我们写了一个定时器程序,控制led灯变色,设想是1s灯的颜色变化一次,也就是说我们1s改变一次GPIO寄存器ODR的值就可以了。但是如果我们这样去写代码,那么我们的cpu在1s中,会把这条语句执行无数次,ODR的值会反复的被赋值。
void main(void)
{
Initalize();
do
{
LedDisplay();
}while(1);
}
中断服务函数() //使用定时器中断来给进行定时
{
对a进行自增或者自减操作;
}
unsigned int a;
void LedDisplay(void)
{
switch(a)
{
case 1:
GPIOA->ODR = 0x00000001 //打开PA1的输出口
break;
case 2:
GPIOA->ODR = 0x00000002 //打开PA2的输出口
break;
}
上面的程序,烧到板子里面,确实,led会按想的那样,2个灯会交替闪烁,时间间隔为1s。但是在1s过度到2s的过程中,a一直是1,那么会导致switch(1)一直不断的运行,严重浪费系统资源。
如果我们的程序这样写,就能避免这个问题:
unsigned int a,b;
void InitLedDisplay(void)
{
a = 0;
b = 1;
}
void LedDisplay(void)
{
unsigned int Temp;
Temp = a;
if(Temp != b)
{
b = Temp;
if(temp = 0)
{
b = 初值;
a = 初值;
}
switch(Temp)
{
case 1:
GPIOA->ODR = 0x00000001 //打开PA1的输出口
break;
case 2:
GPIOA->ODR = 0x00000002 //打开PA2的输出口
break;
}
}
}
上面代码中,a,b为全局变量,实际使用的时候常用全局结构体变量,在mian函数的文件中,会有函数会对a的值进行改变,比如在中断服务函数中,让a每1s自增一次。b这个值为中间的控制变量,b的值会跟随a的值,但是会慢一拍。这样每次进入到这个函数的时候,碰到if语句,如果条件不满足,就不会执行if里面的内容