TOG 0 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба Друзья, имеется микроконтроллер STM32L051. Размер встроенного флэша у данного МК 64 кБ. нужно разместить во внутренней флэш памяти большой массив данных - 16 кБ. Я размещаю этот массив ближе к началу флэш памяти, а именно по смещению 2кБ от начала, пробовал и в конце флэш памяти размещать. У меня такое чувство, что я что-то делаю не так. Хотя компилятор ошибок не выдает и все вроде работает, но периодически возникают какие-то чертовски странные сбои - программа может буквально на ровном месте улететь в Hard Fault. #define PageSize 128 #define zDATA_addr 0x08000000 + 16 * PageSize static const uint8_t zDATA[] __attribute__((at(zDATA_addr)))= { 0x40, 0x32, 0xD2, 0x60, 0xF9, 0x23, 0x71, 0x11, 0x06, 0x6E, 0x75, 0x86, 0x3F, 0x7C, 0x76, 0x77, 0x98, 0x03, 0x74, 0x77, 0x37, 0x44, 0x5C, 0x12, 0x23, 0xC4, 0xA3, 0x1B, 0x15, 0x5B, 0x48, 0x35, 0x4B, 0x27, 0xDB, 0x63, 0xA1, 0x73, 0x34, 0x5A, 0x92, 0x39, 0x64, 0x34, 0x23, 0x21, 0x5E, 0x4E, 0x90, 0x91, 0x3A, 0x3C, 0x13, 0x78, 0xAB, 0x06, 0xDF, 0x3B, 0x68, 0x14, 0x65, 0x26, 0x53, 0x42, // 1000 строк по 16 байт... 0x50, 0x51, 0x6A, 0x2C, 0x33, 0x58, 0x6B, 0x76, 0xD3, 0x4B, 0x68, 0x74, 0x75, 0x36, 0x72, 0x30}; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 169 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба Я думаю, искать надо не тут а непосредственно в коде. Map-файл что говорит? Реальность под отладчиком что говорит? Уверен, что говорят о правильном размещении всех данных. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба Хм, а STM32L0 разрешает побайтовый доступ к флеш? с ходу вижу вот чего пишут: Quote 3.3.4 Address alignment An aligned access is an operation where a word-aligned address is used for a word, or multiple word access, or where a halfword-aligned address is used for a halfword access. Byte accesses are always aligned. There is no support for unaligned accesses on the Cortex-M0+ processor. Any attempt to perform an unaligned memory access operation results in a HardFault exception. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 75 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба 2 часа назад, TOG сказал: Я размещаю этот массив ближе к началу флэш памяти, а именно по смещению 2кБ от начала, пробовал и в конце флэш памяти размещать. Как минимум не располагать в начале - там располагается сама программа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба Ну и просто посмотрите, после доступа к какому адресу возникает Hard Fault. Если ситуация стабильная- то отлаживается с полпинка. Обычно это проблемы с доступом к памяти- или невыровненный адрес или к отсуствующей области адресов. Особенно часто возникает при косвенных адресации- забыли проинитить и привет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 169 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба 11 минут назад, Ruslan1 сказал: Хм, а STM32L0 разрешает побайтовый доступ к флеш? Разрешает. 11 минут назад, Ruslan1 сказал: с ходу вижу вот чего пишут: А Вы сами читали, что в той сноске пишут-то? =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TOG 0 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба 47 minutes ago, HardEgor said: Как минимум не располагать в начале - там располагается сама программа. Я пробовал много разных вариантов. Компилятор умеет обходить эту таблицу куда бы я ее не разместил, ну в самое начало 0x08000000 я ее понятно не ставил. Получается идет код, потом таблица, потом продолжение кода. Я где-то тут встречал тему, где обсуждалось, что дескать плохо если инициализированные переменные оказались ниже самой программы. Но почему это "плохо" я не понял. 47 minutes ago, Ruslan1 said: Ну и просто посмотрите, после доступа к какому адресу возникает Hard Fault. Если ситуация стабильная- то отлаживается с полпинка. Обычно это проблемы с доступом к памяти- или невыровненный адрес или к отсуствующей области адресов. Особенно часто возникает при косвенных адресации- забыли проинитить и привет. Там все куда более странно. Hard Fault возникает при чтении инициализированного массива(глобальная переменная). Читаю из функции. uint8_t dat[] = {1,2,3,4,5,6,7,8,9}; // глобальная переменная SimpleFunc(dat, 4, sig); void SimpleFunc(uint8_t* Buf1, signed int Vector1, uint32_t* Sig) { ... Dat2 = Buf1[Vector1 - 1]; // Тут возникает Hard Fault. Если эту строку закомментировать, то Hard Fault возникает дальше на строке if (Vector1 != 1) // тут тоже может возникнуть Hard Fault Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба 1 час назад, Ruslan1 сказал: Byte accesses are always aligned. Раз доступ к байту всегда выровнен, значит он разрешен. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 75 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба 36 минут назад, TOG сказал: Получается идет код, потом таблица, потом продолжение кода. А вы реально это видите, или предполагаете? Посмотрите с помощью "STM32 ST-LINK Utility" что все данные записаны верно. У вас в обоих случаях Hardfault возникает на переменой Vector1, причём здесь таблица? Смотрите отладчиком что там происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ruslan1 17 11 июля, 2020 Опубликовано 11 июля, 2020 · Жалоба 1 hour ago, Arlleex said: Разрешает. А Вы сами читали, что в той сноске пишут-то? =) А, ну да. 56 minutes ago, Darth Vader said: Раз доступ к байту всегда выровнен, значит он разрешен. угу. иду спать. зарапортовался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 226 12 июля, 2020 Опубликовано 12 июля, 2020 · Жалоба А что - в STM32L0 отсутствуют регистры ядра, описывающие причину HF? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 12 июля, 2020 Опубликовано 12 июля, 2020 · Жалоба 9 часов назад, TOG сказал: Dat2 = Buf1[Vector1 - 1]; // Тут возникает Hard Fault. Попробуйте разделить выражение явно, как его вычисляет ядро и посмотреть, где случится хардфолт: Цитата register signed int Indx = Vector1; Indx -= 1; register uint8_t Data = Buf1[Indx]; Dat2 = Data; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 133 12 июля, 2020 Опубликовано 12 июля, 2020 · Жалоба Откройте, наконец, окно дизассемблера и пройдите проблемный участок по командам. Найдите команду, на которой происходит исключение, выложите участок кода и содержимое регистров. Смотреть на исходный код бесполезно - оптимизатор может перемешать его или выкинуть и отладчик будет показывать какие-то левые строчки, не соответсвующие исполняемым командам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rkit 4 12 июля, 2020 Опубликовано 12 июля, 2020 · Жалоба const-переменные хранятся во флеше без всяких лишних телодвижений. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 169 12 июля, 2020 Опубликовано 12 июля, 2020 · Жалоба 56 минут назад, rkit сказал: const-переменные хранятся во флеше без всяких лишних телодвижений. Это Вы к чему написали? Вот тут будут во Flash, например? void func(u32 k) { const u32 i = k * 5; ... } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться