Digi 0 9 июня, 2021 Опубликовано 9 июня, 2021 · Жалоба Пытаюсь перетащить код с STM32F1 на F4 и тут у меня возникают проблемы с работоспособностью кода. Понимаю, что где то косяк у меня, но найти не получатся. Дело в том что при отладке по шагам всё работает правильно, а при запуске - происходят не ожидаемые события. Как пример функция инициализации портов. Если ходить по шагам, то всё работает. А если запустить, то переписывала те биты, которые не должна была бы. void UART_ConfigGPIO(GPIO_TypeDef* GPIO, uint16_t InpPin, uint16_t OutPin) { GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = InpPin; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_Init(GPIO, &GPIO_InitStructure); ... Т.е. GPIO_InitStructure содержала ещё GPIO_Speed, GPIO_OType, GPIO_PuPd, которые я должен был проинициализировать. Но почему то при ходьбе по шагам в них были нули, а при запуске - значение, которое выходило за допустимые. Собственно вопрос. Сейчас, в зависимости от размещения кода, прога сваливается в WWDG_IRQHandler (). Причем если вставить до запуска RTOS какие нибудь не значащие функции (например задержку, или зажечь свтодиодик), то удается заставить её работать без сбоев. Если поставить брекпоинт на vTaskStartScheduler(); войти в функцию по шагам и потом продолжить выполнение, то тоже всё работает. Какие есть способы поиска этого глюка ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 9 июня, 2021 Опубликовано 9 июня, 2021 · Жалоба 4 часа назад, Digi сказал: Но почему то при ходьбе по шагам в них были нули, а при запуске - значение, которое выходило за допустимые... А чего Вы хотели от локальной переменной с автоматическим классом памяти? Цитата Какие есть способы поиска этого глюка? Искать состояние гонок а также избавляться от надежды увидеть что-то (вразумительное) там, где по определению может быть все что угодно. Цитата ...прога сваливается в WWDG_IRQHandler(). У Вас WWDG используется? Иначе получается, что таблицу векторов тоже не перетащили. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 9 июня, 2021 Опубликовано 9 июня, 2021 · Жалоба GPIO_InitTypeDef GPIO_InitStructure = {0}; Заставить себя понимать, как работает процессор. Понятно, что на белом дыму, пока он не выйдет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Digi 0 9 июня, 2021 Опубликовано 9 июня, 2021 · Жалоба 11 hours ago, Arlleex said: А чего Вы хотели от локальной переменной с автоматическим классом памяти? Ожидал одинакового поведения при шаговой отладке и работе проца )) 11 hours ago, Arlleex said: У Вас WWDG используется? Иначе получается, что таблицу векторов тоже не перетащили. В том то и дело, что не используется. Более вероятно, что что-то его взводит.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 9 июня, 2021 Опубликовано 9 июня, 2021 · Жалоба 40 минут назад, Digi сказал: Ожидал одинакового поведения при шаговой отладке и работе проца )) Оно и так одинаковое: содержимое неинициализированных автоматических переменных - случайное и в том и в другом случае. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Digi 0 9 июня, 2021 Опубликовано 9 июня, 2021 · Жалоба Попадает он в исключение вот так. Как он там оказывается, не пойму, где смотреть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 9 июня, 2021 Опубликовано 9 июня, 2021 · Жалоба В PC попал каким-то чудом адрес модуля GPIO (0x40003800)... Я про таблицу векторов не просто так написал. Может у вас там активируется вектор, которого в новом контроллере нет, и попадает он на вектор обработчика WWDG. Но начать надо, все-таки, с чистки мест от кода, который полагается на какие-то значения, которые в локальных автоматических переменных априори могут получить любое содержимое. Либо проект целиком сюда выложить, авось там не так все страшно. Но если страшно, то нет, конечно, не выкладывайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 19 hours ago, Digi said: Какие есть способы поиска этого глюка ? Судя по всему вами написанному вам следует тщательно изучать документацию на оба микроконтроллера, чтобы их отличия стали видны. И углубить свои знания по Си (для понимания того, что локальная переменная, созданная в функции, содержит мусор). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 35 minutes ago, haker_fox said: для понимания того, что локальная переменная, созданная в функции, содержит мусор Это не к С относится, а к компилятору и runtime. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 38 minutes ago, x893 said: Это не к С относится, а к компилятору и runtime. Да вы что? А луна-то круглая) То, чем инициализируются переменные, описано в соответствующих книгах. Иначе бы программировать на этом языке было бы невозможно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 1 hour ago, haker_fox said: А луна-то круглая) Не может быть ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 22 часа назад, Digi сказал: Т.е. GPIO_InitStructure содержала ещё GPIO_Speed, GPIO_OType, GPIO_PuPd, которые я должен был проинициализировать. Основное отличие программирования F4 от F1 через CubeMX cостоит в том, что в структуре GPIO_InitTypeDef появилось новое поле "Alternate", через которое теперь в явном виде задаются функции пинов порта, отличные от ногодрыга. Например: GPIO_InitStruct.Alternate = GPIO_AF2_TIM4; При переходе от F1 на F4 необходимо эти поля проинициализировать для каждого конкретного случая и занулить, если переопределение стандартной функции не используется. Однако проще всего создать для F4 новый проект, задав в нем системные клоки и описав в нем функции портов. А в уже сгенерированный код добавить всё то. что было у вас прежде написано под F1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 1 час назад, Xenia сказал: Основное отличие программирования F4 от F1 через CubeMX... А почему Вы решили, что ТС пользуется кубом? Я тоже люблю телепатию, так что предложу свой более конкретный вариант. Так как довести CPU до состояния, указанному в отладочном окне, не так уж и просто лишь при помощи не заполненных полей GPIO_InitTypeDef, то (глядя на адрес GPIO в PC) мне почему-то кажется, что у него банально во FreeRTOS не хватает стеков задачам, а может стек вовсе не выровнен на 8. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 7 minutes ago, Arlleex said: А почему Вы решили, что ТС пользуется кубом? Учитывая общее обленение населения, такое предположение не лишино смысла)))))) Я тоже потелепатирую чуток) 8 minutes ago, Arlleex said: FreeRTOS не хватает стеков задачам Если автор её использует, то ему можно включить ловушку в файле FreeRTOSConfig.h #define configCHECK_FOR_STACK_OVERFLOW 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Xenia 35 10 июня, 2021 Опубликовано 10 июня, 2021 · Жалоба 55 минут назад, Arlleex сказал: А почему Вы решили, что ТС пользуется кубом? Я тоже люблю телепатию, так что предложу свой более конкретный вариант. Так как довести CPU до состояния, указанному в отладочном окне, не так уж и просто лишь при помощи не заполненных полей GPIO_InitTypeDef, то (глядя на адрес GPIO в PC) мне почему-то кажется, что у него банально во FreeRTOS не хватает стеков задачам, а может стек вовсе не выровнен на 8. Потому, что сама структура GPIO_InitTypeDef, пример инициализации которой приведен в топовом сообщении, определена в пакете CubeMX, здесь: \Drivers\STM32F4xx_HAL_Driver\Inc\ А если бы она была определена в CMSIS, то вопрос о том, что использует топикстартер, оставался бы открытым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться