zoukankan      html  css  js  c++  java
  • EI901: C51 In-Circuit Programming

      这门课,必修,两学分,每周三课时,对于电院大三狗来说不知有多无聊。

      然而博主还是有所收获的,至少发现自己一年之前写的按键防抖检测脑洞好大。

      事实上,我们可以把一个定时中断的 ISR 分成几个 timeSlot,然后在其中一个 timeSlot 里检查按键电位变化,例如针对SW0:

        if (sw0_level==0) {
            sw0_pressTime++;
            if (sw0_pressTime==pressTimeMax)
                sw0_pressEvent = 1;
        } else
            sw0_pressTime = 0;

      然后在主函数或者中断的另一个 timeSlot 里边根据 sw0_pressEvent 这个信号执行相应控制动作,执行完毕后将 sw0_pressEvent 置零。这样 sw0_pressTime 只记录连续检测到低电平的次数,别的什么都不用管;sw0_pressEvent 只用作控制信号,表示是否有一次控制动作需要执行。

      分离关注(SoC)的思想在单片机编程这个全局变量横飞的血腥世界里依旧熠熠生光。

      课程后期,我们的任务是控制开环小车走固定路线。为了能够随时调整每一段路程的运行时间,我使用了一个八位整数 point 动态计算控制变化的时间点。在源代码中,我使用了goto语句,在这里用 do...while(0) 进行了重构(对于没有 do...while 语句的语言可用 while(1){... break;}):

     1 void main(void)
     2 {
     3     Int16U data runTimeCnt = 0;
     4     Int8U data point;
     5     
     6     /* some initializations, omitted here */
     7     
     8     while (1) {
     9         runTimeCnt++;
    10         do {
    11             point = time0;
    12             if (runTimeCnt<point) {
    13                 go_straight();
    14                 break;
    15             }
    16             point += time1;
    17             if (runTimeCnt<point) {
    18                 turn_right();
    19                 break;
    20             }
    21             point += time2;
    22             if (runTimeCnt<point) {
    23                 go_straight();
    24                 break;
    25             }
    26             point += time3;
    27             if (runTimeCnt<point) {
    28                 turn_left();
    29                 break;
    30             }
    31             point += time4;
    32             if (runTimeCnt<point) {
    33                 go_straight();
    34                 break;
    35             }
    36             rest();
    37         } while(0);
    38         
    39         /* remaining section, omitted here */
    40         
    41     }
    42 }

      然而,博主还是有所疏忽,真正运行的时候发现舵机并没有按预想的情况运行。后来发现其原因在于 point 只分配八位内存明显太少,导致了动态计算时加法溢出,幸好发现得还算及时,没有浪费太长时间进行调试。

  • 相关阅读:
    多线程《三》进程与线程的区别
    多线程《二》开启线程的两种方式
    多线程《一》线程理论
    多进程《七》生产者消费者模型
    多进程《六》队列
    互斥锁与join
    多进程《五》互斥锁
    多进程《四》守护进程
    再度认识未来——2.11
    开始——2.10
  • 原文地址:https://www.cnblogs.com/DevinZ/p/4529544.html
Copyright © 2011-2022 走看看