本帖最后由 熊仔 于 2023-7-17 20:48 编辑
如果使用sdcc编译,large模式,汇编代码真的很长
- _delay_ms:
- mov r7,dph
- mov a,dpl
- mov dptr,#_delay_ms_ms_65536_18
- movx @dptr,a
- mov a,r7
- inc dptr
- movx @dptr,a
- ; src\main.c:30: do{
- mov dptr,#_delay_ms_ms_65536_18
- movx a,@dptr
- mov r6,a
- inc dptr
- movx a,@dptr
- mov r7,a
- ; src\main.c:32: while(--i);
- 00109$:
- mov r4,#0x60
- mov r5,#0x09
- 00101$:
- dec r4
- cjne r4,#0xff,00126$
- dec r5
- 00126$:
- mov a,r4
- orl a,r5
- jnz 00101$
- ; src\main.c:33: }while(--ms);
- dec r6
- cjne r6,#0xff,00128$
- dec r7
- 00128$:
- mov dptr,#_delay_ms_ms_65536_18
- mov a,r6
- movx @dptr,a
- mov a,r7
- inc dptr
- movx @dptr,a
- mov a,r6
- orl a,r7
- jnz 00109$
- mov dptr,#_delay_ms_ms_65536_18
- mov a,r6
- movx @dptr,a
- mov a,r7
- inc dptr
- movx @dptr,a
- ; src\main.c:34: }
- ret
复制代码
执行的代码确实很多,主要看中间 i-- 部分代码
- 00101$:
- dec r4
- cjne r4,#0xff,00126$
- dec r5
- 00126$:
- mov a,r4
- orl a,r5
- jnz 00101$
复制代码
这里共需要9T,比keil生成的汇编少了1T。
所以 i = MAIN_Fosc / 9000; //9T
最终延时函数修改成下面:
- void delay_ms(uint16_t ms)
- {
- uint16_t i;
- do{
- i = MAIN_Fosc / 9000; //9T
- while(--i);
- }while(--ms);
- }
复制代码
改9000后,汇编r4,r5 的值变了,24000000/9000=2666=0x0A6A
- 00109$:
- mov r4,#0x6a
- mov r5,#0x0a
复制代码
当然因为参数ms保存在xdata空间,导致外循环时间稍微有点长。导致延时稍微加长。
- void main(void)
- {
-
- while (1)
- {
- P3 = ~P3;
- delay_ms(10);
- }
-
- }
复制代码
实测效果还是挺准的。

|