Jump to content

    
Sign in to follow this  
TOG

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

Recommended Posts

Друзья,

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

 

 

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites
2 часа назад, TOG сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
11 минут назад, Ruslan1 сказал:

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

Разрешает.

 

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

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

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

Share this post


Link to post
Share on other sites
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  

 

Share this post


Link to post
Share on other sites
36 минут назад, TOG сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, Arlleex said:

Разрешает.

 

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

А, ну да.

56 minutes ago, Darth Vader said:

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

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

Share this post


Link to post
Share on other sites
9 часов назад, TOG сказал:

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

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

Цитата

register signed int Indx = Vector1;

Indx -= 1;

register uint8_t Data = Buf1[Indx];

Dat2 = Data;

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
56 минут назад, rkit сказал:

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

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

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

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

:wink:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this