-
- если Andrey190(240 знак., 14.05.2021 12:04)
- uint32_t* data uint64_t m[5] ?? В каких то случаях ARM не 32-разрядная машина, а
64-разрядная. - VLLV(14.05.2021 10:36)
- Внутри хала должна быть просто запись по адресу с инкрементом двух 32разрядных слов. Врядли тут засада возможна. - Andreas(14.05.2021 11:20)
- а что там есть внутрях 64-х разрядного? кроме, возможно, умножителя - Mahagam(14.05.2021 10:48)
- вот ниже более опытный товарищ подсказывает выравнивание стека по 8 байтам - VLLV(14.05.2021 11:25)
- все равно не могу понять - напуркуа оно 32-х разрядному
контроллеру? и там ниже - выравниваение по 4 байтам вроде. - Mahagam(14.05.2021 13:59)
- По большому счету для CM0 выравнивание стека на 8 байт не нужно,
просто ABI у ARM одинаков для всех кортексов, а камням с плавучкой
выравнивание стека на 8 байт необходимо. - LightElf(14.05.2021 14:12)
- а почему? и что, один push в одно слово сломает стек? или как? - Mahagam(14.05.2021 14:14)
- LDRD, STRD? - SciFi(14.05.2021 14:32)
- вроде как две 32-х разрядные транзакции по шине. но да, давно с
армами не сталкивался. спасиб за инфу. - Mahagam(14.05.2021 14:51)
- По ссылке некая выжимка про выравнивание. Там 8 байт необходимо для LDRD, STRD только у "ARMv5 and earlier". Но я ещё сталкивался с тем, что компилятор использовал знание о том, что младшие три бита адреса нули, в адресной арифметике. Соответственно, если это нарушалось, код ломался. - SciFi(14.05.2021 15:02 - 15:24, ссылка)
- вроде как две 32-х разрядные транзакции по шине. но да, давно с
армами не сталкивался. спасиб за инфу. - Mahagam(14.05.2021 14:51)
- LDRD, STRD? - SciFi(14.05.2021 14:32)
- а почему? и что, один push в одно слово сломает стек? или как? - Mahagam(14.05.2021 14:14)
- По большому счету для CM0 выравнивание стека на 8 байт не нужно,
просто ABI у ARM одинаков для всех кортексов, а камням с плавучкой
выравнивание стека на 8 байт необходимо. - LightElf(14.05.2021 14:12)
- все равно не могу понять - напуркуа оно 32-х разрядному
контроллеру? и там ниже - выравниваение по 4 байтам вроде. - Mahagam(14.05.2021 13:59)
- вот ниже более опытный товарищ подсказывает выравнивание стека по 8 байтам - VLLV(14.05.2021 11:25)
- А ячейки стерты? Если не ff или то же значение то и будет fault. - Andreas(14.05.2021 09:33)
- да конечно - Balda(14.05.2021 12:42)
- ХЗ как в хале, но вот вполне рабочая прога Andreas(830 знак., 14.05.2021 12:57)
- да конечно - Balda(14.05.2021 12:42)
- На какой строчке вылетает? Ну и сразу версия: выравнивание стека по
8 байтам сломано. - SciFi(14.05.2021 07:45)
- на Hal функции и вылетает. Balda(39 знак., 14.05.2021 12:44)
- Для начала неплохо было бы подтвердить или опровергнуть.
Внутрисхемный отладчик, вычислить инструкцию, на которой вылетает,
получить значения регистров во время выполнения этой инструкции. - SciFi(14.05.2021 12:48)
- в момент хардфола Balda(240 знак., 14.05.2021 12:58)
- Так хал может не то пишет просто? Andreas(105 знак., 14.05.2021 13:09)
- что характерно, этот код в других проектах работает, а тут на
тебе... - Balda(14.05.2021 13:26)
- предположу Nikolay801_(388 знак., 14.05.2021 13:38)
- что характерно, этот код в других проектах работает, а тут на
тебе... - Balda(14.05.2021 13:26)
- Надо шагать в режиме дизассемблера. По инструкциям, а не по строкам
сишника. - SciFi(14.05.2021 13:00)
- За шаг до хардфола Balda(34 знак., 14.05.2021 13:08, картинка, картинка)
- R2 не кратен 4. Это data, третий аргумент при вызове функции
Write_Flash(). То есть кривой указатель ищите где-то выше. - SciFi(14.05.2021 13:31)
- r2 это uint64_t m[5], локальная переменная - само в стеке ложится, уж где положилась, там положилась. - Nikolay801_(14.05.2021 13:51)
- да, 0х20000AAA это указатель на массив с данными для записи Balda(25 знак., 14.05.2021 13:35)
- Да, действительно изменил на 0x20000aa8 записалось. блин ну какой
геморой ща предстоит.. фактически эти данные для записи
инкапсулированы в протокол и кривость указателя будет от погоды на
Марсе. - Balda(14.05.2021 13:42)
- Самый простой способ решить эту проблему - объявить параметр data как указатель на __packed: il-2(111 знак., 14.05.2021 15:54)
- Ну так про выравнивание надо помнить. Чтобы от него не зависеть,
можно данные протокола вытаскивать при помощи memcpy. Например,
"uint32_t tmp; memcpy(&tmp, unaligned_ptr, sizeof tmp);". При
этом неровный указатель нельзя объявлять как "uint32_t* ptr", зато
можно "void* ptr" или "uint8_t* ptr". - SciFi(14.05.2021 13:47)
- Спасибо коллеги Balda(34 знак., 14.05.2021 19:02)
- Да, действительно изменил на 0x20000aa8 записалось. блин ну какой
геморой ща предстоит.. фактически эти данные для записи
инкапсулированы в протокол и кривость указателя будет от погоды на
Марсе. - Balda(14.05.2021 13:42)
- R2 не кратен 4. Это data, третий аргумент при вызове функции
Write_Flash(). То есть кривой указатель ищите где-то выше. - SciFi(14.05.2021 13:31)
- За шаг до хардфола Balda(34 знак., 14.05.2021 13:08, картинка, картинка)
- Так хал может не то пишет просто? Andreas(105 знак., 14.05.2021 13:09)
- в момент хардфола Balda(240 знак., 14.05.2021 12:58)
- Для начала неплохо было бы подтвердить или опровергнуть.
Внутрисхемный отладчик, вычислить инструкцию, на которой вылетает,
получить значения регистров во время выполнения этой инструкции. - SciFi(14.05.2021 12:48)
- на Hal функции и вылетает. Balda(39 знак., 14.05.2021 12:44)