Перейти к содержанию
    

Правильно ли я размещаю большой массив данных во внутренней флэш памяти STM32L051 ?

Друзья,

имеется микроконтроллер 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};  

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я думаю, искать надо не тут а непосредственно в коде.

Map-файл что говорит? Реальность под отладчиком что говорит?

Уверен, что говорят о правильном размещении всех данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хм, а 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.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 часа назад, TOG сказал:

Я размещаю этот массив ближе к началу флэш памяти, а именно по смещению 2кБ от начала, пробовал и в конце флэш памяти размещать.

Как минимум не располагать в начале - там располагается сама программа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну и просто посмотрите, после доступа к какому адресу возникает Hard Fault.

Если ситуация стабильная- то отлаживается с полпинка. Обычно это проблемы с доступом к памяти- или невыровненный адрес или к отсуствующей области адресов. Особенно часто возникает при косвенных адресации- забыли проинитить и привет. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

11 минут назад, Ruslan1 сказал:

Хм, а STM32L0 разрешает побайтовый доступ к флеш?

Разрешает.

 

11 минут назад, Ruslan1 сказал:

с ходу вижу вот чего пишут:

А Вы сами читали, что в той сноске пишут-то? =)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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  

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, Ruslan1 сказал:

Byte accesses are always aligned.

Раз доступ к байту всегда выровнен, значит он разрешен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, TOG сказал:

Получается идет код, потом таблица, потом продолжение кода.

А вы реально это видите, или предполагаете? Посмотрите с помощью "STM32 ST-LINK Utility" что все данные записаны верно.

У вас в обоих случаях Hardfault возникает на переменой Vector1, причём здесь таблица? Смотрите отладчиком что там происходит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Arlleex said:

Разрешает.

 

А Вы сами читали, что в той сноске пишут-то? =)

А, ну да.

56 minutes ago, Darth Vader said:

Раз доступ к байту всегда выровнен, значит он разрешен.

угу. иду спать. зарапортовался.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, TOG сказал:

Dat2 = Buf1[Vector1 - 1];  // Тут возникает Hard Fault.

Попробуйте разделить выражение явно, как его вычисляет ядро и посмотреть, где случится хардфолт:

Цитата

register signed int Indx = Vector1;

Indx -= 1;

register uint8_t Data = Buf1[Indx];

Dat2 = Data;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Откройте, наконец, окно дизассемблера и пройдите проблемный участок по командам. Найдите команду, на которой происходит исключение, выложите участок кода и содержимое регистров.

Смотреть на исходный код бесполезно - оптимизатор может перемешать его или выкинуть и отладчик будет показывать какие-то левые строчки, не соответсвующие исполняемым командам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

56 минут назад, rkit сказал:

const-переменные хранятся во флеше без всяких лишних телодвижений.

Это Вы к чему написали?

Вот тут будут во Flash, например?

void func(u32 k)
{
  const u32 i = k * 5;
  ...
}

:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...