首页 > 代码库 > C51错误集130101

C51错误集130101

2013-01-28
void*/void xdata *
    在值为0时有区别,因为它们还保存了存储区域,导致0值的void xdata *如果转换为 void*再和NULL比较时,并不相等;直接把类似void xdata *这样的指针和NULL比较是可以的, 而把它转换成 void*再和NULL比较则不行
不小心将mempool设置到外边去了
stc的gpio有1-2个时钟的强上拉
    stc单片机的gpio, 在从0到1的过程中, 会有 1-2个时钟的强上拉。导致:1.为了使用准双向口读取外界,应当避开强上拉期间,所以从0到1跳变之后,应当等待2周期以上;2.如果单片机的两个pin直接连接,一个是0,一个弱上拉从0跳去1,会导致1-2个周期的大电流通过,有损坏几率,应当避免这样的pin同时为0,或者使用高阻态。
没有在所有逻辑分支中都退出临界区
    在进入临界区之后, 没有在所有逻辑分支中都退出临界区, 导致其后的程序不能进入中断; 现象例如, 串口发送只发送了一字节或者一半
    这样的情况可以使用集中return的方式解决,如:
if... 
    goto    re;
if...
    goto    re;
re:
EXIT_CRITICAL();
return;
或者
do{
    if...
        break;
    if...
        break;
}while(0);
EXIT_CRITICAL();
return;
主从通信有概率收到地址干扰, 特别是485, 表现为不应该处于接收状态的机器莫名其妙的开启了接收; 处理方式, 数据包,校验
引入expect机制/对协议模板的这一缺陷进行修改
    浪费了3个小时调试上, 错误原因是协议模板的filed数组容量填写错误, 试图发送超出数组标示容量指令, 这一错误本来已经产生badarg信息, 但却没有catch它, 今后应当注意调试手段的应用; 可能: 1.引入expect机制, 2.对协议模板的这一缺陷进行修改
2013-02-02 星期六 13:53:53
    发送485数据忘记发地址,只发送了缓冲区...;导致主从无法通信
2013-02-02 星期六 13:54:55
    lcd每次发送数据前忘记等待器件空闲;现象:先发的数据的后几个字被后发的数据覆盖
2013-02-03 星期日 16:34:40
    为了调试而临时做的main,忘记初始化assert prot;现象,断点命令没有任何反应
    忘记给要输出的变量转换成int类型,printf输出乱码
    输出已分配内存指针的时候,忘记将块头自身的 4个字节累加上去;导致遍历失败,卡死
    NULL和0值的u1 xdata*的变量比较相等, 而和同样类型的0值宏比较,则不相等; 还是用类型转换比较好
    for循环中忘记更新变量...低级错误;卡死
2013-03-12 星期二 21:07:04
STC15F单片机的SPI
    SPEN=0时,SS为gpio
    SPEN=1,SSIG=0时:
    ,MSTR=0时,SS为从机被选择
    ,MSTR=1是,SS=0则强制MSTR变为0且被选择;SS=1则为主机(注意此状态下若SPI空闲,则MOSI和SCLK为高阻态,避免总线冲突)
    SPEN=1,SSIG=0时:
    ,SS总是作为gpio
    ,MSTR=0时,SLCK是输入;MSTR=1时,SLCK是输出。(和前面的状态不同,不会形成高阻态)
    总结,如果有多主情况,应当SSIG=0;单主情况,SSIG=1才可以拿SS当GPIO使用
其它注意事项:
    CPHA=0时,SSIG必须为0,否则未定义;且SS需在每两个字节之间拉高一次,以满足相位需求;
2013-03-13 星期三 15:51:31
弄混OV和CY
    PSW.CY进位标记;PSW.AC辅助进位标记;PSW.OV溢出标记;PSW.P奇偶标记;
    CY:.7有进位;    AC:.3有进位;
    OV:有符号运算存在溢出,两正数加结果为负数/两负数加结果为正数,.6有进位而.7没有/.7有进位而.6没有,则1;
    P:ACC中1的个数为奇数则1,否则0;
2013-03-26 星期二 23:01:27
变参函数的参数注意事项
    若传递常数如 1,会被解释为 u1,需要写成(u2)1或1u,否则导致混乱
    若传递指针,需要(u2),否则指针可能会被作为3字节处理
 



来自为知笔记(Wiz)