Size: a a a

2020 October 12

A

Alexander in Embedded Group
Тогда да, можно по кольцу.
А последняя запись - не FFFFFFFF
источник

S

Serg in Embedded Group
V C
Наверное хочу странного, но голову уже сломал..
Есть контроллер stm32F401RE - 512КБ флеши, которые порезаны на сегменты так: 4*16кб, 64кб, 3*128кб. И тут внезапно понадобилось сохранять некоторые параметры. Конечно первое что приходит в голову - сохранять во внутренней флеши по кольцу в паре секторов, неактивный сектор стирать, Ну, все знают. И обычно это делается в последних страницах флеши. НО! у этого контроллера последние страницы - по 128К.. Жаба душит отдавать под несколько не особо часто изменяемых параметров (8байт) аж половину флеши..
А если первые сектора отдать под еепром, но тогда надо каким то образом сказать компилятору что у него жизнь начинается с 0х08010000. Но как?
в линкер-скрипте прописал что флеш начинается с 0х0801000
FLASH  (rx)    : ORIGIN = 0x08010000,   LENGTH = 512K-64K
, в system_stm32f4xx.c прописал VECT_TAB_OFFSET  0x10000.
И... И тишина.
Что еще нужно сделать?
Или нельзя такое провернуть?

Плата разведена, некоторое количество уже изготовлено -> прилепить внешнюю микруху еепром нельзя.
По идее, чтобы приложение стартануло с нужных адресов, кроме ремапа таблицы векторов прерываний, еще нужно задать начальные значения PC и SP. Вот здесь подробнее объясняют.
https://stackoverflow.com/questions/59458156/why-stack-pointer-need-to-be-updated-before-jumping-to-application-from-bootload
источник
2020 October 13

VC

V C in Embedded Group
в общем через линкер определил секцию векторов, потом еепром, потом флеш. в исходнике просто const uint8_t EEPROM[8192] attribute ((section(".eeprom"),used)), и легло куда надо. конечно эта первая секция используется только 400байт, но мне пока не жмет, а в случае чего в нее всегда можно какиенить константы загнать..
источник

VC

V C in Embedded Group
MEMORY
{
 RAM    (xrw)   : ORIGIN = 0x20000000,   LENGTH = 96K
 /*
 */
 VECTOR (rx)  : ORIGIN = 0x08000000,   LENGTH = 16K
 EEPROM (rx)  : ORIGIN = 0x08004000,   LENGTH = 48K
 FLASH  (rx)  : ORIGIN = 0x08010000,   LENGTH = 512K-64K
 
}

/* Sections */
SECTIONS
{


 /* The startup code into "FLASH" Rom type memory */
 .isr_vector :
 {
   . = ALIGN(4);
   KEEP(*(.isr_vector)) /* Startup code */
   . = ALIGN(4);
 } >VECTOR

 .eeprom :
 {
   . = ALIGN(4);
   KEEP(*(.eeprom))
   /*FILL(0xFFFFFF)*/
   . = ALIGN(4);
 } >EEPROM
   
 

 /* The program code and other data into "FLASH" Rom type memory */
 .text :
 {
источник

AK

Anton Kirilenko in Embedded Group
Dima
Полистал доку. Не въехал как проц определяет команды. У меня файл начинается C0 00 00 00 04 7F 00 00. Пытался разобраться что это означает и не понял.
может, надо ещё описание на формат файла? вероятно, у него в начале какие-тос служебные данные идут
источник

ЯМ

Яков Мироничев... in Embedded Group
Ivan
Разве есть что-то круче, чем управление механизированной рукой на металоприемке?
быть владельцем приемки
источник

М

Максим in Embedded Group
Всем привет.
Понимаю что пишу не много не по теме этой группы.
Указатель который передается в функцию тест после вызова функции все равно равен NULL. Помогите пожалуйста разобраться.
https://onlinegdb.com/ByxF5d0fvP
источник

SK

Stas Koynov in Embedded Group
Максим
Всем привет.
Понимаю что пишу не много не по теме этой группы.
Указатель который передается в функцию тест после вызова функции все равно равен NULL. Помогите пожалуйста разобраться.
https://onlinegdb.com/ByxF5d0fvP
тебе нужен указатель на указатель!
источник

М

Максим in Embedded Group
Stas Koynov
тебе нужен указатель на указатель!
Только в аргументе функции?
источник

SK

Stas Koynov in Embedded Group
да и внутри когда будешь присваивать разименуй его
источник

СС

Сиие Сууие in Embedded Group
Stas Koynov
да и внутри когда будешь присваивать разименуй его
при чём тут указатель на указатель
источник

М

Максим in Embedded Group
Если вы имели ввиду так:
uint8_t g_hw_str[] = "Hello world!";

int test(uint8_t ** ap_inpointer)
{
 uint8_t * ptr1 = NULL;
 // TODO something
 if(!(ptr1 = strstr(g_hw_str, "world")))
   {
       printf("world not found!");
       return -1;
   }
   else
   {
       printf("test():Found %s \n\r", ptr1);
   }
   *ap_inpointer = ptr1;
   return 0;
}
то не работает)
источник

SK

Stas Koynov in Embedded Group
Максим
Если вы имели ввиду так:
uint8_t g_hw_str[] = "Hello world!";

int test(uint8_t ** ap_inpointer)
{
 uint8_t * ptr1 = NULL;
 // TODO something
 if(!(ptr1 = strstr(g_hw_str, "world")))
   {
       printf("world not found!");
       return -1;
   }
   else
   {
       printf("test():Found %s \n\r", ptr1);
   }
   *ap_inpointer = ptr1;
   return 0;
}
то не работает)
источник

М

Максим in Embedded Group
Теперь понял, спасибо)
источник

СС

Сиие Сууие in Embedded Group
Максим
Теперь понял, спасибо)
а вас не смущает что у вас конструкция иф в мейне не работает?
источник

СС

Сиие Сууие in Embedded Group
точнее она работает наоборот
источник

М

Максим in Embedded Group
Сиие Сууие
а вас не смущает что у вас конструкция иф в мейне не работает?
Да интересно, не заметил)
источник

М

Михаил촊 in Embedded Group
V C
Наверное хочу странного, но голову уже сломал..
Есть контроллер stm32F401RE - 512КБ флеши, которые порезаны на сегменты так: 4*16кб, 64кб, 3*128кб. И тут внезапно понадобилось сохранять некоторые параметры. Конечно первое что приходит в голову - сохранять во внутренней флеши по кольцу в паре секторов, неактивный сектор стирать, Ну, все знают. И обычно это делается в последних страницах флеши. НО! у этого контроллера последние страницы - по 128К.. Жаба душит отдавать под несколько не особо часто изменяемых параметров (8байт) аж половину флеши..
А если первые сектора отдать под еепром, но тогда надо каким то образом сказать компилятору что у него жизнь начинается с 0х08010000. Но как?
в линкер-скрипте прописал что флеш начинается с 0х0801000
FLASH  (rx)    : ORIGIN = 0x08010000,   LENGTH = 512K-64K
, в system_stm32f4xx.c прописал VECT_TAB_OFFSET  0x10000.
И... И тишина.
Что еще нужно сделать?
Или нельзя такое провернуть?

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

SK

Stas Koynov in Embedded Group
Сиие Сууие
а вас не смущает что у вас конструкция иф в мейне не работает?
почему не работает? просто логика 0 это гуд -1 ошибка. если !0 вывели еррор. не понял, хотя ладно чуваку мы помогли... дальше уже лень
источник

СС

Сиие Сууие in Embedded Group
Stas Koynov
почему не работает? просто логика 0 это гуд -1 ошибка. если !0 вывели еррор. не понял, хотя ладно чуваку мы помогли... дальше уже лень
если гуд то он в мейн он возвращает 0 а иф(0) == фолс
источник