Jump to content

    

STM32 bootloader

Теперь подвис на том, как размер кода задать в самом коде. Как здесь писали, после векторов прерываний разместить, например. С помощью линкера (Кейл).

Вариант 2 - занести в код при расчете CRC и кодировании, внешней программой. Это можно. Нужно только зарезервировать в исходнике место для числа-размера. Может, прямо в стартап добавить?

 

upd. "Нашел" дыру в стартапе. Как, пойдет?

__Vectors       DCD     __initial_sp              ; Top of Stack
                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
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     SVC_Handler               ; SVCall Handler
                DCD     DebugMon_Handler          ; Debug Monitor Handler

Share this post


Link to post
Share on other sites
upd. "Нашел" дыру в стартапе. Как, пойдет?
Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет.

Share this post


Link to post
Share on other sites
Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет.

Полистал книжку по Cortex-M4, там тоже дыра. Можно и после векторов прерываний разместить, но и там сдвиг возможен в новых микроконтроллерах, даже с большей вероятностью.

Линкером класть не умею (вернее, вычислять размер не умею). Буду своей программой записывать, туда же CRC, туда же и серийный номер. STM32 ST-Link Utility умеет перезаписывать флэш (ей серийный номер и обновляю).

 

Э-э, CRC туда поместить нельзя. Иначе при расчете нужно проскакивать ее. Ее лучше в конец приписать, чтобы полный расчет дал 0.

Share this post


Link to post
Share on other sites

Пробую разместить строки в startup.s, чтобы знать точное место. Добавил после определения векторов:

         EXPORT  Serial
         ALIGN 4
Serial DCB  "0000", 0

Вижу в выходном коде свои строки, если к ним нет обращения. Но не видит программа этих переменных из c-файлов, и не компилируется из-за ошибки!

Поможите, чем можете!

Share this post


Link to post
Share on other sites

Напишите перед использованием объявление:

extern uint16_t Serial;

Share this post


Link to post
Share on other sites
Напишите перед использованием объявление:

extern uint16_t Serial;

Так не пробовал. У меня же строка.

А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется.

Как-то надо создать указатели на строки в ассемблерном файле. Неужели вручную?

Сообразил:

TxBuffer_write((char *)&Serial);

Share this post


Link to post
Share on other sites
А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется.
" А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват".

 

Сообразил:

TxBuffer_write((char *)&Serial);

Какое-то масло масляное. Как теперь объявлен Serial?

 

Share this post


Link to post
Share on other sites
" А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват".

Какое-то масло масляное. Как теперь объявлен Serial?

Я, вроде, всё описал выше.

В startup.s:

                EXPORT  Serial
                ALIGN   4
Serial          DCB     "0002",0

В Main.h:

extern const char Serial;

Использую:

  TxBuffer_write((char *)&Serial);

Share this post


Link to post
Share on other sites
Я, вроде, всё описал выше.
Про main.h не было. И текста ругани компилятора не было. Вот так должно работать:

extern const char Serial[];

  TxBuffer_write(Serial);

 

 

extern const char Serial;

А, тогда понятно, почему потребовалось брать адрес и грубой силой приводить его к другому типу.

Share this post


Link to post
Share on other sites
Про main.h не было. И текста ругани компилятора не было. Вот так должно работать:

extern const char Serial[];

Это я попутал с C#, не туда скобки присобачил. :rolleyes: Дал маху. Пишу параллельно шифровщик прошивки на компьютере.

 

Новая загадка всплыла. Серийный номер нужно же сохранить при обновлении прошивки. И в расчете CRC он не должен участвовать. Эх, что-то криво все выходит...

Можно, конечно, в ту самую OTP его прописать.

upd. Но уже был прецедент - переписали номер на корпусе, чтобы солидней выглядело. Меня в известность не поставили. :laughing:

Share this post


Link to post
Share on other sites

Осенило - а что, если разместить серийный номер в конце сектора от загрузчика? Раз записал, номер обновил ST-Link Utility, защиту от записи установил ей же. Остальное - в основной программе.

Share this post


Link to post
Share on other sites

Так и сделал. Только не в конце, а так же, после векторов прерываний.

И еще один вопросик появился. Как в startup.s передать строковую переменную, конкретно, VERSION?

Допустим, в Main.h есть #define VERSION "3.50". Как эту строку забить в ассемблерную DCB команду?

Share this post


Link to post
Share on other sites

Попробую спросить еще раз. Где бы почитать, как задать переменные в asm "file.s" из внешнего "defines.h"? Что-то ничего не нахожу.

 

P.S. Скачал с ARM сайта документы, но... решил обойтись иначе. Ни к чему мне хранить строки в asm-файле. Для работы загрузчика нужно только хранить размер кода. И серийный номер буду записывать вручную по выбранному адресу, а читать чисто указателем на этот адрес.

Share this post


Link to post
Share on other sites
Попробую спросить еще раз. Где бы почитать, как задать переменные в asm "file.s" из внешнего "defines.h"? Что-то ничего не нахожу.

С такими запросами только на IAR переходить :) - он синтаксис С-препроцессора понимает.

Судя по http://infocenter.arm.com/help/index.jsp?t...sm_chebabgi.htm

можно разве что в asm-файле определить символ через GBLS, а потом передать его значение через командную строку (--predefine ... ).

 

Share this post


Link to post
Share on other sites

Почему "только"? :) GCC тоже понимает!

(gcc -x assembler-with-cpp file.S).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this