编程小技巧
技巧一 停下别跑了!快回去!
假如你不想让你的程序,卡死在某一个地方,比如说你需要等待晶振的稳定,需要等待从机的答复,但是这些事情并没有发生,你的程序就一直在这个地方等待着,或者被看门狗复位。这个时候你可以使用嵌入汇编的JMP指令或者使用setjmp()和longjmp()这一对函数,JMP指令的使用很简单,往后面添加上你需要的地址就行,而后面那一对函数则需要,先使用setjmp()保存当前的活动记录表,再用longjmp(),放到你想要的地方跳转回来,不过这个像goto一样尽量少用。
//主循环片段
if(setjmp(buf))
ErrorHanding[Error_Code]();
else
Show_IIC();
//子函数片段
if(MB85RC256V_SequentialRead(MB85RC256V_PageAddress(i,0),num,8) != NORMAL)
{
Error_Code = 0x02;
longjmp(buf,1);
}
技巧二 看看谁copy的最快!
如果你需要将一大堆的数据从这个数组copy到另外一个数组,你会怎么做呢?这还用说吗?循环语句嘛一个一个拷不就行了!确实这样的办法简单又好用,但是在有一些场景下,在C标准库里面为我们准备了一个好东西,memcpy()函数,用它进行拷贝数据,能比我们用循环快很多很多,那这是为什么呢?因为它使用了一种特别的算法可以利用cache来加速!在桌面计算机中,访问速度从大到小是内部寄存器、cache、RAM、ROM,当然成本也是这样排的,用循环语句是从ROM中源地址拷贝到RAM再从RAM拷贝到目标地址,cache比 RAM快,那么在专门优化过的memcpy比普通的循环拷贝快就是理所当然的了。
技巧三 芯片被干扰了!我的代码呢?
如果芯片被外界干扰了一下,然后你发现自己烧入flash的代码没了,可能是芯片取了一条错误的指令,直接执行了flash擦除函数。那这样的情况怎么避免呢!这时候在开发bootloards程序的时候就可以采用flash driver boot loader,名字很长但原理很简单,你写的flash擦除和写入函数最终都会被编译器翻译成机器码,你只要将这段机器码在传入APP程序之前,发给芯片让它明白咋操作就行,用数组存下利用函数指针调用即可!