liguole 发表于 2011-7-21 13:44:50

充分发挥单片机,急需请高手指点!

单片机如同一名员工而程序员则好像是它的领导,怎样才能让单片机有序的而又不冲突完成“领导”(程序员)下达的任务,对于我来讲现在还没有摸透!

例如在做姿态解算时,陀螺、加速度计、AD、以及数据处理及输出

朋友们一起讨论下吧,怎样安排才能充分的利用或发挥单片机的性能!

songshanxiaozi 发表于 2011-7-21 16:52:40

基本的思想是:分时,不能阻塞单片机,具体的实现与实际项目有关

my_avr 发表于 2011-7-21 16:54:49

上操作系统呀

liguole 发表于 2011-7-21 18:53:49

操作系统 似乎不大现实 资源 本来资源就不富裕
分时 有点不太懂 就例如做姿态结算这种 数据处理及高刷新率输出

majianjia 发表于 2011-7-22 00:48:21

while(i)i--;
这应该是课本上害人最深刻的语句了……

lz去理解一下如何用定时器,而不是while。然后去理解一下状态机就可以了。
其实思路很简单,能让中断完成的,就让中断去完成它,对时序要求高的,尽早连续地去做,其他计算插空算

比如你提取传感器数据,如果是模拟的,就给ad中断去提取。然后内核去查询状态即可。
比如你要输出pwm 信号,就用定时器中断来做,不会影响内核的。至于姿态计算,跟中断不冲突啊

liguole 发表于 2011-7-22 01:53:46

谢楼上讲解 我已有所感悟但你所说的 内核是什么?main ()?

winkle 发表于 2011-7-22 08:55:04

告诉楼主:采用多任务非抢占式轮训的架构。由一个定时中断统一“领导”;

liguole 发表于 2011-7-22 11:20:19

你的意思是说 关闭其他中断 或者说在main()中执行的语句放在定时器中断内完成 对吗?

autopass 发表于 2011-7-27 09:14:57

可以考虑这样,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代码入口

colinedeng 发表于 2011-7-29 13:45:50

用状态机描述,再写程序!
页: [1]
查看完整版本: 充分发挥单片机,急需请高手指点!