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

|
сделал по совету scifi . Код memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1)); вроде как считывает корректные данные. значит и запись работает.
|
|
|
|
|
Nov 25 2014, 12:00
|
Гуру
     
Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136

|
Цитата(Jenya7 @ Nov 25 2014, 14:22)  Код memcpy(&flashParam1, 0x0FE00000, sizeof (struct sFlashParam1)); Вы будете смеяться, но это то же самое, что и Код flashParam1 = *(struct sFlashParam1*)0x0FE00000;
|
|
|
|
|
Nov 26 2014, 04:40
|

Профессионал
    
Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045

|
Цитата(scifi @ Nov 25 2014, 17:00)  Вы будете смеяться, но это то же самое, что и Код flashParam1 = *(struct sFlashParam1*)0x0FE00000; это совершенно разные вещи. так структуру объявлять не правильно, тем более для 32-х разрядного проца. Нужно выравнивать к 4-ём. Чтоб не париться над выравниванием лучше в структуре сначало объявить 32-х битные переменные ,потом 16-ти, затем 8-ми.
|
|
|
|
|
Nov 26 2014, 07:02
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(juvf @ Nov 26 2014, 09:40)  это совершенно разные вещи.
так структуру объявлять не правильно, тем более для 32-х разрядного проца. Нужно выравнивать к 4-ём. Чтоб не париться над выравниванием лучше в структуре сначало объявить 32-х битные переменные ,потом 16-ти, затем 8-ми. как я понял если не указывать явно packed компайлер по дефолту делает padding. Цитата(KnightIgor @ Nov 25 2014, 22:37)  Функции работы с флэшем в библиотеке для EFM32 уже объявлены и "сложены" в именованную секцию "ram_code", поэтому нужно секцию "ram_code" лишь как-то поместить в ОЗУ. Как написано в помощи к функции WriteWord Кстати, коль мы о секциях заговорили. Вы можете разместить структуру напрямую в пользовательской странице и работать с ней в коде программы как с нормальной константой во flash: Код const MyType MyStruct __attribute__((section("MYDATA"), used)) = {<init fields>}; В скаттере надо указать, чтобы все константы секции были размещены в пользовательской странице, то есть добавить load region Код LR_IROM_SETS (0xFE00000) 0x200 {; User settings in the user ER_IROM_SETS (0x0FE00000) 0x200 {; flash page *(MYDATA) } } В итоге, можно иметь константы, объявленные в разных участках кода, разных файлах проекта, но принадлежащие одной и той же именованной секции, как это показано выше, и пользовать их как обычные константы. А компоновщик кинет все в нужную область флэша согласно указанию из скаттера. Затем можно, например, через коммуникационный протокол модифицировать все эти константы, настраивая таким образом приложение. Например, сменить адрес узла, и т.п. И не надо хранить "копии" настроек из флэш в ОЗУ: в конце концов ОЗУ в контроллерах всегда существенно меньше, чем флэш. Я пишу в Attolic TrueStudio и я честно говоря не нашел там скаттер файл.
|
|
|
|
|
Nov 26 2014, 13:32
|
Профессионал
    
Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075

|
Цитата(KnightIgor @ Nov 26 2014, 14:34)  Однако способ управления размещением секций должен быть. Навскидку загуглил фразу "atollic truestudio linker script". Куча ссылок. нашел файл efm32_flash.ld CODE /* ***************************************************************************** ** ** File : efm32_flash.ld ** ** Abstract : Linker script for EFM32TG842F32 Device with ** 32KByte FLASH, 4KByte RAM ** ** Set heap size, stack size and stack location according ** to application requirements. ** ** Set memory bank area and size if external memory is used. ** ** Target : Energy Micro EFM32 ** ** Environment : Atollic TrueSTUDIO® ** ** Distribution: The file is distributed “as is,” without any warranty ** of any kind. ** ** ©Copyright Atollic AB. ** You may use this file as-is or modify it according to the needs of your ** project. This file may only be built (assembled or compiled and linked) ** using the Atollic TrueSTUDIO® product. The use of this file together ** with other tools than Atollic TrueSTUDIO® is not permitted. ** ***************************************************************************** */
/* Entry Point */ ENTRY(Reset_Handler)
/* Highest address of the user mode stack */ _estack = 0x20001000; /* end of 4K RAM */
/* Generate a link error if heap and stack don't fit into RAM */ _Min_Heap_Size = 0; /* required amount of heap */ _Min_Stack_Size = 0x80; /* required amount of stack */
/* Specify the memory areas */ MEMORY { FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 32K RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 4K MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K }
/* Define output sections */ SECTIONS { /* The startup code goes first into FLASH */ .isr_vector : { . = ALIGN(4); KEEP(*(.isr_vector)) /* Startup code */ . = ALIGN(4); } >FLASH
/* The program code and other data goes into FLASH */ .text : { . = ALIGN(4); *(.text) /* .text sections (code) */ *(.text*) /* .text* sections (code) */ *(.glue_7) /* glue arm to thumb code */ *(.glue_7t) /* glue thumb to arm code */ *(.eh_frame)
KEEP (*(.init)) KEEP (*(.fini))
. = ALIGN(4); _etext = .; /* define a global symbols at end of code */ } >FLASH
/* Constant data goes into FLASH */ .rodata : { . = ALIGN(4); *(.rodata) /* .rodata sections (constants, strings, etc.) */ *(.rodata*) /* .rodata* sections (constants, strings, etc.) */ . = ALIGN(4); } >FLASH
.ARM.extab : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH .ARM : { __exidx_start = .; *(.ARM.exidx*) __exidx_end = .; } >FLASH
.preinit_array : { PROVIDE_HIDDEN (__preinit_array_start = .); KEEP (*(.preinit_array*)) PROVIDE_HIDDEN (__preinit_array_end = .); } >FLASH .init_array : { PROVIDE_HIDDEN (__init_array_start = .); KEEP (*(SORT(.init_array.*))) KEEP (*(.init_array*)) PROVIDE_HIDDEN (__init_array_end = .); } >FLASH .fini_array : { PROVIDE_HIDDEN (__fini_array_start = .); KEEP (*(SORT(.fini_array.*))) KEEP (*(.fini_array*)) PROVIDE_HIDDEN (__fini_array_end = .); } >FLASH
/* used by the startup to initialize data */ _sidata = LOADADDR(.data);
/* Initialized data sections goes into RAM, load LMA copy after code */ .data : { . = ALIGN(4); _sdata = .; /* create a global symbol at data start */ *(.data) /* .data sections */ *(.data*) /* .data* sections */
. = ALIGN(4); _edata = .; /* define a global symbol at data end */ } >RAM AT> FLASH
/* Uninitialized data section */ . = ALIGN(4); .bss : { /* This is used by the startup in order to initialize the .bss secion */ _sbss = .; /* define a global symbol at bss start */ __bss_start__ = _sbss; *(.bss) *(.bss*) *(COMMON)
. = ALIGN(4); _ebss = .; /* define a global symbol at bss end */ __bss_end__ = _ebss; } >RAM
/* User_heap_stack section, used to check that there is enough RAM left */ ._user_heap_stack : { . = ALIGN(4); PROVIDE ( end = . ); PROVIDE ( _end = . ); . = . + _Min_Heap_Size; . = . + _Min_Stack_Size; . = ALIGN(4); } >RAM
/* MEMORY_bank1 section, code must be located here explicitly */ /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */ .memory_b1_text : { *(.mb1text) /* .mb1text sections (code) */ *(.mb1text*) /* .mb1text* sections (code) */ *(.mb1rodata) /* read-only data (constants) */ *(.mb1rodata*) } >MEMORY_B1
/* Remove information from the standard libraries */ /DISCARD/ : { libc.a ( * ) libm.a ( * ) libgcc.a ( * ) }
.ARM.attributes 0 : { *(.ARM.attributes) } }
только не знаю куда там вставлять. я как вы поняли не такой спец.
|
|
|
|
Сообщений в этой теме
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 @ Nov 25 2014, 17:00) Вы буд... Nov 25 2014, 12:20      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 Golikov A. КодflashParam1 = *(struct sFlashParam1*)0x... Nov 25 2014, 12:39 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 Aaron Цитата(Golikov A. @ Nov 25 2014, 15:39) К... Nov 28 2014, 07:57  KnightIgor Цитата(Aaron @ Nov 28 2014, 09:57) Это, т... Nov 28 2014, 08:18   Сергей Борщ Цитата(KnightIgor @ Nov 28 2014, 10:18) А... Nov 28 2014, 09:53    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
|
|
|