本帖最后由 小米999999 于 2017-3-10 13:09 编辑
写
单片机裸机程序好几年。最近才有一些心得体会。但是我的这些经验大神们确实都已经接触过了,今天想贴出来一是与大家共同学习进步,二是因为没有看书系统学习过,感觉进步比较缓慢,想得到大神的技术方向方面的指导,希望以后进步更快。
1.软件工程设计,将工程分层编写,越细越好。用户层,中层,底层驱动等等。
2.软件任务设计,将控制器要干的事情进行划分,将互相独立的事情分为任务设计。
3.软件各任务程序设计,如果任务复杂,需要不同的设备按照流程进行有序工作,采用状态机的思想执行。CASE语句比较实用。因此,就涉及到CASE中流程的划分,划分的太细不好,太粗也不好。
switch(XLCtl_State)
{
case 0:
XL_reg=reg;
XLCtl_State=6;
break;
case 1:
if(Ycylinder_ForeFunc()==0) //Y气缸下移
{
XLCtl_State=2;
}
break;
case 2:
if(Stuff_Func(XL_reg)==0) //吸料
{
XLCtl_State=3;
}
break;
case 3:
if(Ycylinder_BackFunc()==0) //Y气缸上移
{
XLCtl_State=4;
}
break;
。。。。。。
4.软件预留串口调试接口,在多任务运行过程中,多任务之间要协调工作,在调试时不方便监控。因此,可用一个带有缓冲区的,DMA控制的串口发送,调试信息。此调试信息需要包括单片机的运行时间(系统时钟定时器里工作)还有干了什么事情。
sprintf(u1TxBuf,"%.3fs 传送带:不允许放料rn",
timer/1000.0);
u1sendstr(u1TxBuf);
5.在程序设计中,底层驱动,中层,用户层程序设计应最好高效。将延时等待程序,当作状态机的一个状态,进行管理,延时程序采用系统定时器进行计时管理。
u8 OSTimeDly (u16* ticks,tsTimerDelay * timer)
{
switch(timer->state) //定时器的状态
{
case 0: //定时器空闲
timer->cnt = *ticks; /* Load ticks in TCB */ /* Find next task to run! */
timer->state=1;
break;
case 1: //定时器计时过程
if(timer->cnt ==0)
{
timer->state=0;
}
break;
default :break;
}
return (timer->state);
}
6.底层驱动函数编写有返回状态。