|
|
  |
Локальные переменные и возврат из функции, EWARM, STM32F407 |
|
|
|
Oct 22 2015, 07:36
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Наткнулся на какой-то цирк с конями: в функции используется локальный массив из 10 байт, он ложится в стек, а при возврате программа не отбрасывает эти элементы, а прямо их засовывает с R0-R2, PC, получая, естественно, hardFault. Код void protocolOnRxed (uint8_t *buffer, uint32_t len) { gLen = len; char test[10]; gLen = sprintf(test, "Transfer: %d", len); cdcacm_data_tx(test, gLen); } Я раньше не работал плотно с дизассемблером, не знаю, как там IAR должен разруливать возврат, но он явно должен знать, сколько локальных переменных выделено в стеке и выкидывать их, прежде чем считывать регистры для возврата. Так ведь? В приложении скриншот, там видно и программу, и стек, и дизассемблер.
Эскизы прикрепленных изображений
|
|
|
|
|
Oct 22 2015, 07:55
|

Знающий
   
Группа: Участник
Сообщений: 756
Регистрация: 14-11-14
Пользователь №: 83 663

|
Цитата(drozel @ Oct 22 2015, 11:36)  Наткнулся на какой-то цирк с конями: в функции используется локальный массив из 10 байт, он ложится в стек, а при возврате программа не отбрасывает эти элементы, а прямо их засовывает с R0-R2, PC, получая, естественно, hardFault. Код void protocolOnRxed (uint8_t *buffer, uint32_t len) { gLen = len; char test[10]; gLen = sprintf(test, "Transfer: %d", len); cdcacm_data_tx(test, gLen); } Я раньше не работал плотно с дизассемблером, не знаю, как там IAR должен разруливать возврат, но он явно должен знать, сколько локальных переменных выделено в стеке и выкидывать их, прежде чем считывать регистры для возврата. Так ведь? В приложении скриншот, там видно и программу, и стек, и дизассемблер. А что там за Warnings на вызовы ещё двух п/п?
--------------------
Пролетарий умственного труда.
|
|
|
|
|
Oct 22 2015, 08:21
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Цитата(scifi @ Oct 22 2015, 13:56)  Какой-то трэш и угар. Что-то я не верю, что яр может нагенерить такой код. Или я что-то не понимаю... А я о чем! Но я же правильно локализовал проблему? Скрин убедителен? Немного подробностей: портирую openlibcm3, возможны проблемы со стартапом, но вроде стек в норме. Цитата(Obam @ Oct 22 2015, 13:55)  А что там за Warnings на вызовы ещё двух п/п? implicity declarations --- UPD: Нет, похоже, дело в чем-то другом. Я попробовал создать еще одну функцию с локальным массивом, все выглядит так же, но возвращается нормально. Проблема где-то в другом месте, похоже
Сообщение отредактировал drozel - Oct 22 2015, 08:43
|
|
|
|
|
Oct 22 2015, 08:44
|
Частый гость
 
Группа: Свой
Сообщений: 108
Регистрация: 2-02-11
Пользователь №: 62 650

|
Цитата(Сергей Борщ @ Oct 22 2015, 14:43)  После чего пишет туда строку "Transfer: ", которая уже сама занимает 11 байт. Надо ли говорить, куда будет записано текстовое представление переменной len? Черт! Напоролся, как школьник
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|