реклама на сайте
подробности

 
 
> Запись структуры во флэш.
Jenya7
сообщение Nov 25 2014, 08:32
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 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-битный регистр?
и как мне считать структуру из флэша?


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Nov 25 2014, 12:39
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Код
flashParam1 = *(struct sFlashParam1*)0x0FE00000;


А это по стандарту? Это как-то подменяется на memcpy неявно?
Go to the top of the page
 
+Quote Post
Aaron
сообщение Nov 28 2014, 07:57
Сообщение #3


Местный
***

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



Цитата(Golikov A. @ Nov 25 2014, 15:39) *
Код
flashParam1 = *(struct sFlashParam1*)0x0FE00000;


А это по стандарту? Это как-то подменяется на memcpy неявно?


Это, товарищи, мы с вами бородатые стали слишком sm.gif
Недавно тоже столкнулся с таким кодом - человек структуру просто приравнял к другой структуре. Я сказал ему исправить, но как ни странно, код оказался рабочим. Перечитывать пришлось стандарты языка C sm.gif
Вроде как копирование структур через оператор '=' в std=c99 появилось. Удобная штука! =)
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Nov 28 2014, 08:18
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725



Цитата(Aaron @ Nov 28 2014, 09:57) *
Это, товарищи, мы с вами бородатые стали слишком sm.gif
Недавно тоже столкнулся с таким кодом - человек структуру просто приравнял к другой структуре. Я сказал ему исправить, но как ни странно, код оказался рабочим. Перечитывать пришлось стандарты языка C sm.gif
Вроде как копирование структур через оператор '=' в 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?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 28 2014, 09:53
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 03:11
Рейтинг@Mail.ru


Страница сгенерированна за 0.01945 секунд с 7
ELECTRONIX ©2004-2016