1

我正在使用 STVD IDE 对 STM8S 微控制器进行编程。它使用 COSMIC 编译器。

我发现有一个变量意外增加。调试时我发现汇编代码中有一行导致这个变量增加了它的值。这是一个名为 的函数c_lgadcADC有时在调用堆栈中没有显示相关函数时调用此装配线。

我不明白这段代码来自哪里,这是什么c_lgadc?我的 C 代码中没有名为c_lgadc

这是反汇编的屏幕截图。 在此处输入图像描述

更新:

  • 我不知道我应该检查什么 C 代码,因为每次调用此反汇编行时调用堆栈都不同。
  • 我注意到,当我跨步或进入调试器时,它会到达特定计时器 ISR 的最后一行。
  • 我还注意到带有第二个断点的行是导致我的变量添加的行。具有第一个断点的行总是被调用 5 次,然后具有第二个断点的行被调用一次,依此类推。
  • 我想知道我应该如何进一步调试它以防止意外添加到我的变量中。

更新2:

我在以下内容中找到了map file

c_lgadc 0000f39c defined in (C:\Users\xxxxxxxx\CXSTM8\Lib\libm0.sm8)lgadc.o section .text
                 used in Debug\stm8s_it.o

我不确定这是否有助于澄清问题?

4

2 回答 2

2

我注意到,当我跨步或进入调试器时,它会到达特定计时器 ISR 的最后一行。

所以,这个定时器 ISR 增加一个 4 字节的整数变量,这个变量与你的变量重叠。通过检查 ISR 或链接映射可以揭示这种重叠是如何发生的,或者可能是索引寄存器 X 在 ISR 中没有正确设置。

于 2019-05-08T11:57:12.807 回答
1

该函数c_lgadc看起来像运行时库的一部分。根据上下文的建议,它可能是一个添加进位标志函数,因为它位于比较函数和无符号右移函数之间。

这些函数的c_lc_lg前缀可能是方案的一部分,指示操作数的类型或其结果。

至于你的问题,adc出现在几种CPU架构的指令集中,即intel x86和motorola 680x。它的意思是:

  • 如果进位标志(无符号算术溢出或通过进位标志移位)为零,则返回操作数作为结果。
  • 如果设置了进位标志,则将结果作为与操作数相加的结果返回。
于 2019-05-07T17:31:53.990 回答