充分发挥单片机,急需请高手指点!
单片机如同一名员工而程序员则好像是它的领导,怎样才能让单片机有序的而又不冲突完成“领导”(程序员)下达的任务,对于我来讲现在还没有摸透!例如在做姿态解算时,陀螺、加速度计、AD、以及数据处理及输出
朋友们一起讨论下吧,怎样安排才能充分的利用或发挥单片机的性能! 基本的思想是:分时,不能阻塞单片机,具体的实现与实际项目有关 上操作系统呀 操作系统 似乎不大现实 资源 本来资源就不富裕
分时 有点不太懂 就例如做姿态结算这种 数据处理及高刷新率输出 while(i)i--;
这应该是课本上害人最深刻的语句了……
lz去理解一下如何用定时器,而不是while。然后去理解一下状态机就可以了。
其实思路很简单,能让中断完成的,就让中断去完成它,对时序要求高的,尽早连续地去做,其他计算插空算
比如你提取传感器数据,如果是模拟的,就给ad中断去提取。然后内核去查询状态即可。
比如你要输出pwm 信号,就用定时器中断来做,不会影响内核的。至于姿态计算,跟中断不冲突啊 谢楼上讲解 我已有所感悟但你所说的 内核是什么?main ()? 告诉楼主:采用多任务非抢占式轮训的架构。由一个定时中断统一“领导”; 你的意思是说 关闭其他中断 或者说在main()中执行的语句放在定时器中断内完成 对吗? 可以考虑这样,51的代码
void mainc(void)
{
while(1)
{
while(!F10MS);
F10MS = 0;
...
}
}
如果速度够快的话,就5MS跑一次主程序,然后可以在等待定时标志的时候插入一些对时间比较不敏感的代码,比如LED切换等,但执行时间不要太长.
中断尽量不要用C的中断编写方式,因为那可能会占用比较多的堆栈以及增加不必要的代码执行时间,
然后中断里面这样做
USING 1
CSEG AT 0x000B
;/***************************************************************************************
;定时器0溢出中断向量
;***************************************************************************************/
PUSH PSW ;
PUSH ACC ;保护现场
SETB RS0 ;使用第1组工作组寄存器
...
;定时中断服务程序
DJNZ cnt_10ms,exit_int ;10mS计时
MOV cnt_10ms,#TMR_SET_10MS ;
SETB F10MS ;10mS标志
exit_int:
POP ACC ;恢复现场
POP PSW ;
RETI ;
启动代码
;/***************************************************************************************
;段声明
;***************************************************************************************/
MYCODES SEGMENT CODE ;代码段
;/***************************************************************************************
;引入的外部函数/变量
;***************************************************************************************/
EXTRN CODE(mainc) ;C代码入口
DSEG AT 0x70
;/***************************************************************************************
;定义堆栈空间
;***************************************************************************************/
MYSTACKS: DS 16 ;预留16个字节作为堆栈空间
CSEG AT 0x0000
;/***************************************************************************************
;RAM初始化
;***************************************************************************************/
MOV R0,#0x7F ;2
MOV @R0,#0x00 ;2
DJNZ R0,$ - 2 ;2
LJMP START ;3
RSEG MYCODES
;/***************************************************************************************
;系统初始化
;***************************************************************************************/
START:
MOV SP,#MYSTACKS ;设置堆栈指针
MOV TMOD,#0x02 ;设置定时器
;MOV TL0,#(256 - 125) ;省略,由TH0载入
MOV TH0,#(256 - 125) ;125uS溢出时间常数
...
;其他初始化
MOV IE,#0x82 ;开启中断,启动定时器
SETB TR0
LJMP mainc ;C代码入口 用状态机描述,再写程序!
页:
[1]