|
|
  |
Hard fault на EXTI |
|
|
|
Oct 20 2015, 07:43
|
Гуру
     
Группа: Участник
Сообщений: 2 219
Регистрация: 16-08-12
Из: Киров
Пользователь №: 73 143

|
Цитата(Golikov A. @ Oct 20 2015, 09:51)  Без кода одна статическая переменная может портить другую статическую переменную только из вредности. Это я опускаю тот факт что вообще переменная переменную испортить не может а вот программа работая с переменными может. Тут что-то явно глубже обработчика EXTI. Автору надо внимательно пересмотреть код, особенно тот, что модифицирует эти переменные, ибо копаться в регистрах в данном случае, это терять время, особенно, если "не очень" в армовском асме, ИМХО, конечно
|
|
|
|
|
Oct 20 2015, 07:57
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (mantech @ Oct 20 2015, 10:43)  ибо копаться в регистрах в данном случае, это терять время, особенно, если "не очень" в армовском асме, ИМХО, конечно  "копатся в регистрах" к ассемблеру имеет дело второе - результат "копания" это нахождение по адресам места в исходнике которое приводит к вылету. И абсолютно НИЧЕГО сложного в этом нет, если голова на плечах есть и возможность думать. Ну а если по принципу "а чего тут думать - трясти надо", то тогда, конечно "время терять"  .
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2015, 09:39
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (Golikov A. @ Oct 20 2015, 11:11)  вот вам сценарий программа на 5 секунде работы портит память, а через 4 часа обращается по указанному в этой памяти указателю. В результате улет и трам пам пам. По регистрам вы найдете где улетела, а почему улетела - нет. Вы же уже сами сказали - испорчена совершенно конкретная область памяти. Круг поисков ОЧЕНЬ сузился. Фактически до рассмотрения ошибок работы с соседними переменными. QUOTE Опять же есть вариант долгой цепочки не фатальных пакостей которая кончается бедой, так что не всегда анализ регистров - абсолютное добро которое решит все проблемы. Вообще-то я писал и про стек. По нему видна в том числе и цепочка вызовов, посему найти виноватого в том, что какая-нибудь memecpy() вызывает вылет, совершенно реально. Вот, например, моя типичная диагностическая распечатка в лог при вылете: CODE Abort:[D] PC:000000D0 Op:E4940004 CPSR:200000D3 LR:7FFFE35F SP:40000180 SP[0]:000000D0->E4940004->200000D3->7FFFE35F-> SP[4]:40000180->7FFFE35B->400001C8->00000008 Test:AC0F9D3F R0:7FFFE35B R1:400001C8 R2:00000008 R3:A100DA57 R4:BFB79FEA R5:600000D3 R6:0000001F R7:1303D214 R8:67A9084B R9:104B3212 R10:D0F03A0C R11:96195E20 R12:1F496802 QUOTE ТС локализовал проблему... Что он там "локализовал", не понимая НИЧЕГО в собственно процессе локализации, никому не ведомо.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Oct 20 2015, 14:25
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(Golikov A. @ Oct 20 2015, 02:51)  правильнее сказать методом тыка обнаружили место куда вбить костыль чтобы ошибка перестала проявляться как раньше.
Без кода одна статическая переменная может портить другую статическую переменную только из вредности. Это я опускаю тот факт что вообще переменная переменную испортить не может а вот программа работая с переменными может.
Я бы конечно сказал бы что виноват стэк, но для статических переменных это вроде бы не верное утверждение, так что думаю проблема лежит глубже, вы просто задавили один из симптомов, потому прошли и другие симптомы, а проблем вы не обнаружили, и как следствие не исправили... ну или похвастайтесь уже кодом... Absolutely not. I did find what is happening and just now figure out exactly why and what is the case. The short answer is alignment. The exti_s struct is in the one .h file used by two different .c files. One treats it as packed(expected behaviour), another is not. That is how one static variable overwrites another. Sermo animi est imago: qualis vir, talis et oratio est Цитата(aaarrr @ Oct 20 2015, 04:28)  А автор не нашел, несмотря на наличие содержимого stack frame и "мурзилки" с его описанием. Чем тут можно помочь? Help is always possible but desire and patience are required.
Сообщение отредактировал pitt - Oct 20 2015, 14:19
--------------------
|
|
|
|
|
Oct 20 2015, 15:35
|
Гуру
     
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454

|
Да русский он, на английском пишет для солидности Вон английского мало, он латынь подключил, правда пока в основном пословицами и не всегда подходящего содержания, но в целом нормально  солидно звучит  Ну если вы нашли что у вас проблемы с выравниванием, кстати вдруг понял что реально не знаю что за проц используется, но думаю что кортекс м4  , так вот если вы нашли проблемы с выравниванием, то так и надо писать что из-за выравнивания в одной функции переменные налезали и бла бла бла, а не то что она переменная портит другую.... Если вы пакованную структуру передаете в функцию, объявите в функции прием пакованных параметров на вход, и должно полегчать. А еще лучше через typdef сразу объявить пакованную структуру и как структуру и как подставляемую в функцию переменную.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|