Понимание функций в разборке stm8s? - PullRequest
1 голос
/ 07 мая 2019

Я программирую микроконтроллер STM8S, используя STVD IDE. Он использует COSMIC-компилятор.

Я обнаружил, что есть достоверный показатель, который неожиданно вырос. При отладке я обнаружил, что в коде сборки есть строка, в которой эта переменная увеличивает свое значение. Это функция с именем c_lgadc. Иногда эта сборочная линия вызывается, когда в стеке вызовов не отображается связанная с ADC функция.

Я не понимаю, откуда этот код и что это за c_lgadc? У меня нет функции в моем коде C с именем c_lgadc

Вот скриншот разборки. enter image description here

UPDATE:

  • Я не знаю, какой код на C следует проверять, так как стек вызовов каждый раз, когда вызывается эта линия разборки.
  • Я заметил, что когда я перехожу в отладчик, до последней строки конкретного таймера ISR.
  • Я также заметил, что строка со второй точкой останова вызывает добавление к моей переменной. Строка с первой точкой останова всегда вызывается 5 раз со второй точкой останова вызывается один раз и т. д.
  • Я бы хотел знать, как мне отлаживать это дальше, чтобы предотвратить неожиданное добавление к моей переменной.

UPDATE2:

Я нашел следующее в map file:

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

Я не уверен, поможет ли это выяснить проблему?

Ответы [ 2 ]

2 голосов
/ 08 мая 2019

Я заметил, что когда я перехожу в отладчик или перехожу, он доходит до последней строки определенного таймера ISR.

Итак, этот таймер ISR увеличивает 4-байтовую целочисленную переменную, и эта переменная перекрывается с вашей переменной. Как происходит такое перекрытие, можно узнать, проверив этот ISR или карту ссылок, или, возможно, индексный регистр X неправильно установлен в ISR.

1 голос
/ 07 мая 2019

Функция c_lgadc выглядит как часть библиотеки времени выполнения. Согласно контексту, это, вероятно, функция добавить флаг переноса , поскольку она находится между функциями сравнение и беззнаковое смещение вправо .

Префиксы c_l и c_lg для этих функций, вероятно, являются частью схемы, указывающей типы операндов или их результат.

Что касается вашего вопроса, adc встречается в наборе команд нескольких архитектур ЦП, а именно Intel X86 и Motorola 680x. Это значит:

  • Если флаг переноса (арифметическое переполнение без знака или сдвиг через флаг переноса) равен нулю, вернуть операнд в качестве результата.
  • Если установлен флаг переноса, вернуть результат как добавленный к операнду.
...