环境为 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测试环境的朋友请帮忙测试一下,谢谢。 |
STM8S003F3U6 请求各位大佬支援,但是遇到如下问题。。。这样就一定是这颗芯片的问题吗?
STVD如何生成库文件
STM8 flash 库函数 startaddress = startaddress + ((uint32_t)BlockNum * FLASH_BLOCK_S
stm 8 flash 在RAM运行代码的问题,是不是库函数有问题 Library call (?sll32_l0_l0_a) from within a
STM 有能替代MCHC912B32CFUE8 / NXP的型号吗?
STM8S的CAN总线使用
STM8L151在使用DAC功能后严重发热
STM8 IIC SLAVE 400K
STM8S 定时器1互补输出pwm
STM8S003F3 NRST电压低,无法开机
即:汇编时,对于一些小于等于16位大小(对于8位单片机来说)的常量,与8位大小的变量使用了不同的寄存器传值,在没有栈的情况下,这应该属于编译器来负责解决的问题。否则一堆的常量都要经过显示转换了。
果然,搜索了下关于STVD的帖子:
https://www.stmcu.org.cn/module/forum/thread-189562-1-1.html
确实STVD有很多问题,强烈建议别用了。