一个STM8编译器的问题,用过STM8的来看看
时间:12-12
整理:3721RD
点击:
环境为 STVD v4.3.5 + COSMIC v4.3.4
代码大致如下:
void LED_Fill(uint8_t ucData)
{
// bla bla...
}
int main()
{
LED_Fill(0x00);
return 0
}
LED_Fill()函数使用uint8_t作为参数,main函数中调用,很简单的一段代码。
运行不对,逻辑分析仪发现总线出来的值不对,然后调试器跟踪,
并查阅COSMIC的官方手册。手册表明,单个函数参数8位通过累加器A传递,
16位通过索引寄存器X传递。
main函数中调用LED_Fill()函数上下文如下:
main.c:113 LED_Fill(0x00);
0x8af5 <main+9> 0x5F CLRW X
0x8af6 <main+10> 0xCD8903 CALL 0x8903
可以看出,参数是通过X来传递的,main函数认为作为参数的0x00是uint16_t类型,
因此在调用之前CLRW X指令来清X寄存器。
跟踪LED_Fill()函数发现函数中对于形参ucData用的是累加器A中的值。
main调用时把参数放到X中,但是LED_Fill用的却是累加器A中的值,结果就错误了。
尝试修改调用函数为:LED_Fill((uint8_t)0x00),结果就正确了,函数上下文如下:
main.c:113 LED_Fill((uint8_t)0x00);
0x8af5 <main+9> 0x4F CLR A
0x8af6 <main+10> 0xCD8903 CALL 0x8903
按照我的理解,函数形参为uint8_t,调用时0x00作为实参,不应该有任何问题,即使
实参位宽大于形参,也应该发生截断才对。同样的代码在Keil4环境下面一切正常。
是我理解的问题,还是COSMIC这个编译器特殊?或者说是编译器的bug?
有STM8测试环境的朋友请帮忙测试一下,谢谢。
代码大致如下:
void LED_Fill(uint8_t ucData)
{
// bla bla...
}
int main()
{
LED_Fill(0x00);
return 0
}
LED_Fill()函数使用uint8_t作为参数,main函数中调用,很简单的一段代码。
运行不对,逻辑分析仪发现总线出来的值不对,然后调试器跟踪,
并查阅COSMIC的官方手册。手册表明,单个函数参数8位通过累加器A传递,
16位通过索引寄存器X传递。
main函数中调用LED_Fill()函数上下文如下:
main.c:113 LED_Fill(0x00);
0x8af5 <main+9> 0x5F CLRW X
0x8af6 <main+10> 0xCD8903 CALL 0x8903
可以看出,参数是通过X来传递的,main函数认为作为参数的0x00是uint16_t类型,
因此在调用之前CLRW X指令来清X寄存器。
跟踪LED_Fill()函数发现函数中对于形参ucData用的是累加器A中的值。
main调用时把参数放到X中,但是LED_Fill用的却是累加器A中的值,结果就错误了。
尝试修改调用函数为:LED_Fill((uint8_t)0x00),结果就正确了,函数上下文如下:
main.c:113 LED_Fill((uint8_t)0x00);
0x8af5 <main+9> 0x4F CLR A
0x8af6 <main+10> 0xCD8903 CALL 0x8903
按照我的理解,函数形参为uint8_t,调用时0x00作为实参,不应该有任何问题,即使
实参位宽大于形参,也应该发生截断才对。同样的代码在Keil4环境下面一切正常。
是我理解的问题,还是COSMIC这个编译器特殊?或者说是编译器的bug?
有STM8测试环境的朋友请帮忙测试一下,谢谢。
沙发!
没见过这类问题,下午帮你试试