|
Запись структуры во флэш. |
|
|
|
Nov 25 2014, 08:32
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Я работаю с камнем EFM32TG842. У него есть сектор во флэше для записи данных пользователя - страница 512 байт. Я хочу записать туда свою структуру. Код struct sFlashParam { uint16_t customerID; uint32_t mainCounter; uint32_t CWcounter; uint8_t mode; uint8_t channel; uint8_t meter_type; …и так далее. } и потом пишу. Код WriteToFlash(0x0FE00000, (uint32_t*)&flashParam1); функция выглядит так Код void WriteToFlash(uint32_t address, uint32_t *data) { uint32_t *addr = (uint32_t *) address; //(uint32_t *)0x0FE00000; MSC_Init(); MSC_ErasePage(addr); MSC_WriteWord(addr, data, sizeof(data)); MSC_Deinit(); } вопрос как структура запишется? каждый член структуры в 32-битный регистр? и как мне считать структуру из флэша?
|
|
|
|
|
 |
Ответов
|
Nov 28 2014, 07:57
|

Местный
  
Группа: Свой
Сообщений: 243
Регистрация: 5-10-06
Из: Зеленоград
Пользователь №: 21 007

|
Цитата(Golikov A. @ Nov 25 2014, 15:39)  Код flashParam1 = *(struct sFlashParam1*)0x0FE00000; А это по стандарту? Это как-то подменяется на memcpy неявно? Это, товарищи, мы с вами бородатые стали слишком  Недавно тоже столкнулся с таким кодом - человек структуру просто приравнял к другой структуре. Я сказал ему исправить, но как ни странно, код оказался рабочим. Перечитывать пришлось стандарты языка C  Вроде как копирование структур через оператор '=' в std=c99 появилось. Удобная штука! =)
|
|
|
|
|
Nov 28 2014, 08:18
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Aaron @ Nov 28 2014, 09:57)  Это, товарищи, мы с вами бородатые стали слишком  Недавно тоже столкнулся с таким кодом - человек структуру просто приравнял к другой структуре. Я сказал ему исправить, но как ни странно, код оказался рабочим. Перечитывать пришлось стандарты языка C  Вроде как копирование структур через оператор '=' в std=c99 появилось. Удобная штука! =) А если глянуть в ассемблер, то при таком копировании используется memcpy(). Кстати, о C99. Он позволяет объявлять локальные массивы переменной длины внутри функции, в зависимости, скажем, от входного параметра: Код void func(size_t size) { char buffer[size]; ... } Под KEIL для этого используется malloc(). Так что нужно позаботиться о размере heap и полезно проверять: if (buffer) {...}. Правда, что делать, если buffer будет NULL, тоже не ясно. Hard Fault генерировать? Вообще, жаль, что malloc(), а не типа SP -= size. Интересно, как делает GCC?
|
|
|
|
|
Nov 28 2014, 09:53
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(KnightIgor @ Nov 28 2014, 10:18)  А если глянуть в ассемблер, то при таком копировании используется memcpy(). Может использоваться. А может не использоваться. А может не использоваться даже там, где явно вызывается в исходнике. Зависит от степени продвинутости компилятора. Например, если затраты на вызов memcpy() окажутся больше, чем прямое копирование через регистры. Если компилятор знает, что скопировать нужно 4 байта - проще и быстрее их перекидать через регистры. Цитата(KnightIgor @ Nov 28 2014, 10:18)  Под KEIL для этого используется malloc(). Хм. забавно. Стандарт говорит (6.2.4) , что такой массив должен иметь automatic storage duration, в то время как созданные через malloc() объекты имеют allocated storage duration. С другой стороны, если компилятор сам в нужных местах вызывает malloc() и free() для такого объекта - вроде бы и требования для automatic storage duration выполняются. То есть решение неожиданное, но тем не менее не запрещенное. gcc размещает такой массив на стеке.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
Jenya7 Запись структуры во флэш. Nov 25 2014, 08:32 редактор Скорее всего как в памяти отображается так и запиш... Nov 25 2014, 09:17 Golikov A. а вы запишите, считайте и узнаете
наверняка есть ... Nov 25 2014, 09:18 Jenya7 Цитата(Golikov A. @ Nov 25 2014, 15:18) а... Nov 25 2014, 09:38  scifi Цитата(Jenya7 @ Nov 25 2014, 12:38) Кодvo... Nov 25 2014, 09:54 jcxz Цитата(Jenya7 @ Nov 25 2014, 14:32) вопро... Nov 25 2014, 09:29 Golikov A. тут прикол в другом
uint32_t size
а при вызове ... Nov 25 2014, 10:00 Jenya7 Цитата(Golikov A. @ Nov 25 2014, 16:00) т... Nov 25 2014, 10:12 mantech Цитата(Jenya7 @ Nov 25 2014, 11:32) У нег... Nov 25 2014, 10:06 Golikov A. ЦитатаИ что, прямо так и записывается, без всяких ... Nov 25 2014, 10:16 Jenya7 Цитата(Golikov A. @ Nov 25 2014, 16:16) п... Nov 25 2014, 11:02 Golikov A. sizeof - выдает длину в байтах.
и для инта_32 буде... Nov 25 2014, 11:07 Jenya7 сделал по совету scifi .
Код
memcpy(... Nov 25 2014, 11:22 scifi Цитата(Jenya7 @ Nov 25 2014, 14:22) Кодme... Nov 25 2014, 12:00  Jenya7 Цитата(scifi @ Nov 25 2014, 17:00) Вы буд... Nov 25 2014, 12:20  juvf Цитата(scifi @ Nov 25 2014, 17:00) Вы буд... Nov 26 2014, 04:40   Jenya7 Цитата(juvf @ Nov 26 2014, 09:40) это сов... Nov 26 2014, 07:02    KnightIgor Цитата(Jenya7 @ Nov 26 2014, 09:02) Я пиш... Nov 26 2014, 09:34     Jenya7 Цитата(KnightIgor @ Nov 26 2014, 14:34) О... Nov 26 2014, 13:32      KnightIgor Цитата(Jenya7 @ Nov 26 2014, 15:32) нашел... Nov 27 2014, 15:40       AHTOXA Нет, RAM-функции надо не в bss (это неинициализиро... Nov 27 2014, 18:08   Сергей Борщ Цитата(juvf @ Nov 26 2014, 06:40) так стр... Nov 26 2014, 07:05 Jenya7 Цитата(Golikov A. @ Nov 25 2014, 17:39) К... Nov 25 2014, 12:48 scifi Цитата(Golikov A. @ Nov 25 2014, 15:39) К... Nov 25 2014, 16:54    KnightIgor Цитата(Сергей Борщ @ Nov 28 2014, 11:53) ... Nov 28 2014, 18:28 Golikov A. Мне как-то кажется такое присвоение не корректным,... Nov 25 2014, 13:48 KnightIgor Цитата(Jenya7 @ Nov 25 2014, 10:32) Я раб... Nov 25 2014, 14:25 Jenya7 Цитата(KnightIgor @ Nov 25 2014, 19:25) .... Nov 25 2014, 14:43  KnightIgor Цитата(Jenya7 @ Nov 25 2014, 16:43) спаси... Nov 25 2014, 17:37 Golikov A. получается копирование структур по указателю выдае... Nov 25 2014, 16:47 Golikov A. но как я понимаю главное в коде не забыться и не н... Nov 25 2014, 17:58 KnightIgor Цитата(Golikov A. @ Nov 25 2014, 19:58) М... Nov 25 2014, 22:43 Golikov A. да вот что-то получается что так наоборот даже бол... Nov 26 2014, 06:26 scifi Цитата(Golikov A. @ Nov 26 2014, 09:26) н... Nov 26 2014, 07:25 Golikov A. Прикольно, но все же не очень красиво. Дефайн пере... Nov 26 2014, 08:33 scifi Цитата(Golikov A. @ Nov 26 2014, 11:33) П... Nov 26 2014, 09:07 Velund Конкретно для иара...
#pragma pack(1)
описание с... Nov 26 2014, 09:07 Golikov A. ЦитатаНа это ИМХО могу ответить фактами: ничего не... Nov 26 2014, 10:31 scifi Цитата(Golikov A. @ Nov 26 2014, 13:31) а... Nov 26 2014, 11:40 Golikov A. спасибо, погляжу Nov 26 2014, 12:13 Golikov A. ну да на стэке как то логичнее... Он же локальный.... Nov 28 2014, 10:57
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|