Jump to content

    

pokk

Участник
  • Content Count

    151
  • Joined

  • Last visited

Community Reputation

0 Обычный

About pokk

  • Rank
    Частый гость

Recent Profile Visitors

2109 profile views
  1. Это типа в каждом модуле по включени происходи десерилизация нужные ему настроек и заполнение статических перименных ими. А как их переинициализировать, при измении конфигурации ? Запускать заного функцию иницилизацию данного модуля при измении конфига? Непонял, это это как ? jcxz, как все смутно представляю грубо говоря у вас на выходе есть два массива, один типа string с ключами а другой указатели на элементы структуры (power.voltDC.max) , а макросами вы задаете инкапсуляцию обьектов (структур), и создание соответствий двух этим массивов?
  2. AlexandrY, jcxz, какие библиотеки используете для JSON или что-то свое? А как дальше использование сохраненных настроек в формате JSON ? С кажем нужен коэффициент параметра который высчитывается каждую секунду. По включению/изменению конвертируем все настройки JSON в структуру в RAM и работаем через структуру? Да видал уже его, но для web все равно использую JSON, по этому думаю на нём остановиться, что бы не тянуть лишнее библиотеки. А можно по подробнее, как это по таблице соответствий применяете ? Скажем: {"Param1":134,"Param2":134} На ключ param1 вызовется обработчик для param1 и установить его в структуру а для второго параметра другая соответствующая функция?
  3. Да проблема в том что старый блок программы надо "раздвинуть" и внутри что-то изменить, и это в лучшем случае. О благодарю такой вариант мне больше нравиться.
  4. А сам алгоритм конвертации примерно такой? Записать новые параметры в отдельную область NewParam По изменению версии ПО вызвать свой обработчик в котором раписано: NewParam1.value=PrevParam1.value NewParam2.value=PrevParam2.value NewParam3.value=PrevParam3.value Записать NewParam на место PrevParam
  5. Добрый день,в каждом моем устройте есть общий блок(структура) настроек и констант+ CRC всех настроек. Гипотетически, после настройки, калибровки и отправки устройства пользователю, решили сделать, доработку программы, в которой необходимо сохранять какие то значения в блок настроек, причем в середину блока (либо изменения формата(структру) одного из параметра входящего в блок настроек). Так вот как можно изменить программу у пользователя, с сохранением настроек/калибровки и внести новые данные ? Пока решение ввижу только одно, скачать блок настроек у пользователя, и посредством стороней программы сконвертировать, в новый блок, но такой вариант не сильно нравиться хотелось бы без сторонего ПО.
  6. Да это стандартный файл, я его изменил в процессе "настройки" секции на нужный адрес, а исходный оставил. У меня в каждом проекте, есть папка chip, в которой находиться startup, файл линкер *.icf, и другие хедеры относившиеся к ядру и серии процессора(stm32f4xx.h). При таких настройках place in FlashDefault_region {first section .FlashDefault}; place in FlashVar_region {first section .FlashVar}; Получаем то что мне надо "P6": 0xe0 .FlashDefault const 0x80c'0000 0x0 startup_stm32f4xx_Boot.o [1] .FlashDefault const 0x80c'0000 0xe0 VarFlash.o [1] А если не указывать first то получим. "P6": 0xe0 .FlashDefault const 0x80c'0000 0xe0 VarFlash.o [1] .FlashDefault const 0x80c'00e0 0x0 startup_stm32f4xx_Boot.o [1] - 0x80c'00e0 0xe0 В таблицу векторов запишется адрес конца секции настроек, а не начала.
  7. Дело бы в этом: Изменил диапазон секции FLASH до начала секций с настройками, и поменял .intvec на const стало так: Section Kind Address Size Object ------- ---- ------- ---- ------ "P1": 0xc894 IMAGE_HEAD 0x802'0000 0x19c <Block> .intvec const 0x802'0000 0x1c startup_stm32f4xx_Boot.o [1] .checksum const 0x802'001c 0x4 Place holder __checksum .PointCodehead const 0x802'0020 0x4 startup_stm32f4xx_Boot.o [1] .intvecTail const 0x802'0024 0x164 startup_stm32f4xx_Boot.o [1] .codehead const 0x802'0188 0x14 startup_stm32f4xx_Boot.o [1] .rodata const 0x802'019c 0x10 HTTP_v2.o [1] PS: ещё добавил модификатор first к секции настроек, что бы указатель указывал на начало секций а не конец.
  8. Вы про SECTION .intvec:CODE:NOROOT(2) ? Убрал не помогло Вообще я ваш пример успешно применил на stm32f103 кусок стартапа: MODULE ?cstartup ;; Forward declaration of sections. SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2) EXTERN hard_fault_handler_c EXTERN __iar_program_start EXTERN init_rcc PUBLIC __vector_table PUBLIC __beginCodehead EXTERN __checksum_begin, __checksum_end ;;------------------------------------------------------ ;;--------Указатель на адрес основных настроек---------- ;;------------------------------------------------------ PUBLIC __beginFlashVarAddr SECTION .FlashVar:CONST:ROOT(2) __beginFlashVarAddr ;; SettingSignature ;;------------------------------------------------------ ;;--------Указатель на адрес дефолтных настроек---------- ;;------------------------------------------------------ PUBLIC __beginFlashDefaultAddr SECTION .FlashDefault:CONST:ROOT(2) __beginFlashDefaultAddr ;;------------------------------------------------------ ;;----------------Указатель на Header code-------------- ;;------------------------------------------------------ PUBLIC __Codehead SECTION .codehead:CONST:ROOT(2) __Codehead DC32 0xAABBCCDD ;;signatur DC32 __checksum_begin DC32 __checksum_end DC32 __beginFlashDefaultAddr DC32 __beginFlashVarAddr ;;------------------------------------------------------ ;;----------------Указатель на Header code-------------- ;;------------------------------------------------------ PUBLIC __PointCodehead SECTION .PointCodehead:CONST:ROOT(2) __PointCodehead DC32 __beginCodehead ;;------------------------------------------------------ ;;------------------------------------------------------ ;;------------------------------------------------------ SECTION .intvec:CONST:ROOT(8) DATA __vector_table DCD sfe(CSTACK) DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler ;;---------------------------------------------------------------------- SECTION .intvecTail:CONST:ROOT(2) DATA ;Продолжение таблицы векторов прерываний __vector_table_tail ;;---------------------------------------------------------------------- ;;DCD 0 ; Зането CRC ;;DCD 0 ; занято __beginCodehead DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler Файл линкера initialize by copy { readwrite }; do not initialize { section .noinit }; define block IMAGE_HEAD with fixed order {section .intvec, section .checksum, section .PointCodehead, section .intvecTail, section .codehead}; place in ROM_region {readonly, first block IMAGE_HEAD,section .SoftWare,section .SectSHA1,block WebContent}; place in FlashDefault_region {first section .FlashDefault}; place in FlashVar_region {first section .FlashVar}; place in CrashLog_region {first section .CrashLog}; define block MEM_FIRST with fixed order {section .StartingRam}; place in RAM_region { readwrite, first block MEM_FIRST, last block CSTACK, block HEAP }; И в процессе переноса на stm32f405 возникла ситуация с начальным адресом, по этому начал убирать все лишнее (что сязанно с секцией настройками) по этому и остались хвосты.
  9. Да я тоже об этом думал пробовал поменять местами все равно так же define block IMAGE_HEAD with fixed order {section .intvec, section .intvecTail}; place in FLASH_region {first block IMAGE_HEAD,readonly}; Да если его использовать то работает как надо.
  10. Делаю hex для bootloader в stm32f405. В файле линкера создал блок образа IMAGE_HEAD (урезанный там больше указателей) и перенес туда адрес начала таблицы прерываний. и два региона для хранение настроек FlashDefault_region, располагаються в последних двух секторах. /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\linker\ST\IcfEditor\stm32f40x_fsmc.xml" */ /*-Specials-*/ define symbol __ICFEDIT_intvec_start__ = 0x08020000; /*-Memory Regions-*/ define symbol __ICFEDIT_region_FLASH_start__ = 0x08020000; define symbol __ICFEDIT_region_FLASH_end__ = 0x080FFFFF; define symbol __ICFEDIT_region_FSMC11_start__ = 0x0; define symbol __ICFEDIT_region_FSMC11_end__ = 0x0; define symbol __ICFEDIT_region_FSMC12_start__ = 0x0; define symbol __ICFEDIT_region_FSMC12_end__ = 0x0; define symbol __ICFEDIT_region_FSMC13_start__ = 0x0; define symbol __ICFEDIT_region_FSMC13_end__ = 0x0; define symbol __ICFEDIT_region_FSMC14_start__ = 0x0; define symbol __ICFEDIT_region_FSMC14_end__ = 0x0; define symbol __ICFEDIT_region_NAND1_start__ = 0x0; define symbol __ICFEDIT_region_NAND1_end__ = 0x0; define symbol __ICFEDIT_region_NAND2_start__ = 0x0; define symbol __ICFEDIT_region_NAND2_end__ = 0x0; define symbol __ICFEDIT_region_PCARD_start__ = 0x0; define symbol __ICFEDIT_region_PCARD_end__ = 0x0; define symbol __ICFEDIT_region_CCRAM_start__ = 0x10000000; define symbol __ICFEDIT_region_CCRAM_end__ = 0x1000FFFF; define symbol __ICFEDIT_region_SRAM1_start__ = 0x20000000; define symbol __ICFEDIT_region_SRAM1_end__ = 0x2001BFFF; define symbol __ICFEDIT_region_SRAM2_start__ = 0x2001C000; define symbol __ICFEDIT_region_SRAM2_end__ = 0x2001FFFF; define symbol __ICFEDIT_region_BKPR_start__ = 0x40024000; define symbol __ICFEDIT_region_BKPR_end__ = 0x40024FFF; /*--------------------Sector0---------------------------------------*/ /*--------------------Sector10---------------------------------------*/ define symbol __ICFEDIT_region_FlashDefault_start__ = 0x080C0000; define symbol __ICFEDIT_region_FlashDefault_end__ = 0x080DFFFF; /*--------------------Sector_11---------------------------------------*/ define symbol __ICFEDIT_region_FlashVar_start__ = 0x080E0000; define symbol __ICFEDIT_region_FlashVar_end__ = 0x080FFFFF; /*--------------------------------------------------------------*/ /*-Sizes-*/ define symbol __ICFEDIT_size_cstack__ = 0x2000; define symbol __ICFEDIT_size_heap__ = 0x2000; /**** End of ICF editor section. ###ICF###*/ define memory mem with size = 4G; define region FLASH_region = mem:[from __ICFEDIT_region_FLASH_start__ to __ICFEDIT_region_FLASH_end__ ]; define region FSMC_region = mem:[from __ICFEDIT_region_FSMC11_start__ to __ICFEDIT_region_FSMC11_end__] | mem:[from __ICFEDIT_region_FSMC12_start__ to __ICFEDIT_region_FSMC12_end__] | mem:[from __ICFEDIT_region_FSMC13_start__ to __ICFEDIT_region_FSMC13_end__] | mem:[from __ICFEDIT_region_FSMC14_start__ to __ICFEDIT_region_FSMC14_end__]; define region NAND_region = mem:[from __ICFEDIT_region_NAND1_start__ to __ICFEDIT_region_NAND1_end__ ] | mem:[from __ICFEDIT_region_NAND2_start__ to __ICFEDIT_region_NAND2_end__ ]; define region PCARD_region = mem:[from __ICFEDIT_region_PCARD_start__ to __ICFEDIT_region_PCARD_end__ ]; define region CCRAM_region = mem:[from __ICFEDIT_region_CCRAM_start__ to __ICFEDIT_region_CCRAM_end__ ]; define region SRAM_region = mem:[from __ICFEDIT_region_SRAM1_start__ to __ICFEDIT_region_SRAM1_end__ ] | mem:[from __ICFEDIT_region_SRAM2_start__ to __ICFEDIT_region_SRAM2_end__ ]; define region BKPR_region = mem:[from __ICFEDIT_region_BKPR_start__ to __ICFEDIT_region_BKPR_end__ ]; define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { }; initialize by copy { readwrite }; //initialize by copy with packing = none { section __DLIB_PERTHREAD }; // Required in a multi-threaded application do not initialize { section .noinit }; //place at address mem:__ICFEDIT_intvec_start__ { readonly section .intvec }; define block IMAGE_HEAD with fixed order {readonly section .intvec, section .intvecTail}; place in FLASH_region {readonly,first block IMAGE_HEAD}; //place in PCARD_region { readonly section application_specific_ro }; place in CCRAM_region { block CSTACK, section .ccram }; place in SRAM_region { readwrite, block HEAP }; place in BKPR_region { section .backup_sram }; define region FlashDefault_region = mem:[from __ICFEDIT_region_FlashDefault_start__ to __ICFEDIT_region_FlashDefault_end__]; define region FlashVar_region = mem:[from __ICFEDIT_region_FlashVar_start__ to __ICFEDIT_region_FlashVar_end__ ]; place in FlashDefault_region {section .FlashDefault}; place in FlashVar_region {section .FlashVar}; Вот кусок стартапа MODULE ?cstartup ;; Forward declaration of sections. SECTION CSTACK:DATA:NOROOT(3) SECTION .intvec:CODE:NOROOT(2) EXTERN __iar_program_start EXTERN SystemInit EXTERN hard_fault_handler_c PUBLIC __vector_table ;;------------------------------------------------------ PUBLIC __beginCodehead EXTERN __checksum_begin, __checksum_end SECTION .intvec:CONST:ROOT(8) DATA __vector_table DCD sfe(CSTACK) DCD Reset_Handler ; Reset Handler DCD NMI_Handler ; NMI Handler DCD HardFault_Handler ; Hard Fault Handler DCD MemManage_Handler ; MPU Fault Handler DCD BusFault_Handler ; Bus Fault Handler DCD UsageFault_Handler ; Usage Fault Handler ;;---------------------------------------------------------------------- SECTION .intvecTail:CONST:ROOT(2) DATA ;Продолжение таблицы векторов прерываний __vector_table_tail ;;---------------------------------------------------------------------- ;;DCD 0 ; Зането CRC ;;DCD 0 ; занято __beginCodehead DCD 0 ; Reserved DCD 0 ; Reserved DCD SVC_Handler ; SVCall Handler DCD DebugMon_Handler ; Debug Monitor Handler DCD 0 ; Reserved DCD PendSV_Handler ; PendSV Handler DCD SysTick_Handler ; SysTick Handler Проблема возникла в том что, таблица прерываний начинает распалагаться, после региона блока настроек FlashDefault_region ******************************************************************************* *** PLACEMENT SUMMARY *** define block IMAGE_HEAD with fixed order { ro section .intvec, section .intvecTail }; "P1": place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD }; define block CSTACK with size = 8K, alignment = 8 { }; "P2": place in [from 0x1000'0000 to 0x1000'ffff] { block CSTACK, section .ccram }; define block HEAP with size = 8K, alignment = 8 { }; "P3": place in [from 0x2000'0000 to 0x2001'bfff] | [from 0x2001'c000 to 0x2001'ffff] { rw, block HEAP }; "P5": place in [from 0x80c'0000 to 0x80d'ffff] { section .FlashDefault }; "P6": place in [from 0x80e'0000 to 0x80f'ffff] { section .FlashVar }; initialize by copy { rw }; No sections matched the following patterns: section .backup_sram in "P4" section .ccram in "P2" Section Kind Address Size Object ------- ---- ------- ---- ------ "P5": 0xe0 P5-1 0x80c'0000 0xe0 <Init block> .FlashDefault inited 0x80c'0000 0xe0 VarFlash.o [1] - 0x80c'00e0 0xe0 "P1": 0xc9fc IMAGE_HEAD 0x80c'0100 0x180 <Block> .intvec ro code 0x80c'0100 0x1c startup_stm32f4xx_Boot.o [1] .intvecTail const 0x80c'011c 0x164 startup_stm32f4xx_Boot.o [1] .checksum const 0x80c'0280 0x4 Place holder __checksum .rodata const 0x80c'0284 0x10 HTTP_v2.o [1] .rodata const 0x80c'0294 0x10 HTTP_v2.o [1] .rodata const 0x80c'02a4 0x8 HTTP_v2.o [1] .rodata const 0x80c'02ac 0x14 HTTP_v2.o [1] .rodata const 0x80c'02c0 0x78 HTTP_v2.o [1] .rodata const 0x80c'0338 0x9c HTTP_v2.o [1] .rodata const 0x80c'03d4 0x18 HTTP_v2.o [1] Почему секция "P1": place in [from 0x802'0000 to 0x80f'ffff] { ro, first block IMAGE_HEAD }; начинаеться после P5 ? и с адресом 0x80c0000 ? Хотя должно с 0x8020000
  11. Stm32f405 запись во Flash 16bit

    Благодарю, так и знал что где-то элементарная ошибка которую упускаю.
  12. Не могу не как понять почему запись по 16bit не работает, устанавливает флаг ошибки PGPERR (Programming parallelism error) и записывает все равно 32bit Из Дашашита uint8_t FLASH_Program_16Bit(uint32_t address,uint16_t data) { while(!flash_ready()); //Ожидаем готовности флеша к записи FLASH->CR = FLASH_CR_PG //Разрешаем программирование флеша |1*FLASH_CR_PSIZE_0 //PSIZE[1:0]:Program size |0*FLASH_CR_PSIZE_1; // 01 program x16 *(__IO uint32_t*)address = (uint16_t)data; //Пишем 2 байта while(!flash_ready());//Ждем завершения операции if(!check_EOP())return 0; FLASH->CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша return check_EOP(); } Запись по 32bit работает uint8_t FLASH_Program_32bit(uint32_t address,uint32_t data) { while(!flash_ready()); //Ожидаем готовности флеша к записи FLASH->CR = FLASH_CR_PG //Разрешаем программирование флеша |0*FLASH_CR_PSIZE_0 //PSIZE[1:0]:Program size |1*FLASH_CR_PSIZE_1; // 10 program x32 *(__IO uint32_t*)address = (uint32_t)data; //Пишем 4 байта while(!flash_ready());//Ждем завершения операции if(!check_EOP())return 0; FLASH->CR &= ~(FLASH_CR_PG); //Запрещаем программирование флеша return check_EOP(); }
  13. Ну это как-то не сильно надежно, но на первый раз сгодиться благодарю!
  14. Заголовок есть, в отправляемом hex файле, но проблема в том что первый пакет по tftp идет запрос с именем файла, и там нет данных из файла ни заголовка ничего. И после ответа на этот запрос уже прийдет пакет с данными, так вот если его пронять в прошивке, а потом перезагрузиться в bootloader, то как процесс передачи инициализировать заного от клиента?
  15. Добрый день, сделал bootloader с загрузкой через tftp, работает хорошо. В кратце boot работает так, если перепрошивка разрешена, то при приеме любого пакета(Write Request (WRQ)) по tftp, происходит перезагрузка в Bootloader через програмный Reset, а дальше по таймауту клиент отправлет этот же запрос ешё раз и тут его уже принимает bootloader и запускаеться процесс перепрошивки. Так вот у меня физически 1 плата с разной модификации, и на ней могут работать 3-4 разных программы. Что бы не плодить кучу версий bootloader сделал его один на все верии ПО. И вот тут возникают возможные грабли, при обновлении через Tftp может зашить ПО от другой прошивки ("чужой"). Вот подумал что при обновлении надо как-то отследить что за ПО и запретить обновлении если оно "чужое". Самым простой способ это под каждую ПО сделать свой bootloader, и в нем проверять уникальный номер, но все же не хочется, плодить кучу версий. Второй вариант, проверять что за прошивка прилетела, и если это ''чужая" прошивка то не переходить в bootloder, но тут возникает проблема, что бы при принять первый пакет с данным tftp, надо клиенту отправить ACK на запрос Write Request (WRQ) и если это сделать то в bootloader, уже не поймает запрос Write Request (WRQ), и не сможет начать процес перепрошивки. Есть ли еще какие нибудь идеи как это можно реализовать ?