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

 
 
8 страниц V  « < 5 6 7 8 >  
Reply to this topicStart new topic
> STM32 bootloader, написание собственного бута
ViKo
сообщение Mar 25 2015, 08:37
Сообщение #91


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Теперь подвис на том, как размер кода задать в самом коде. Как здесь писали, после векторов прерываний разместить, например. С помощью линкера (Кейл).
Вариант 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 25 2015, 09:52
Сообщение #92


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ViKo @ Mar 25 2015, 10:37) *
upd. "Нашел" дыру в стартапе. Как, пойдет?
Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Mar 25 2015, 10:00
Сообщение #93


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Сергей Борщ @ Mar 25 2015, 12:52) *
Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет.

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

Э-э, CRC туда поместить нельзя. Иначе при расчете нужно проскакивать ее. Ее лучше в конец приписать, чтобы полный расчет дал 0.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 25 2015, 13:27
Сообщение #94


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Пробую разместить строки в startup.s, чтобы знать точное место. Добавил после определения векторов:
Код
         EXPORT  Serial
         ALIGN 4
Serial DCB  "0000", 0

Вижу в выходном коде свои строки, если к ним нет обращения. Но не видит программа этих переменных из c-файлов, и не компилируется из-за ошибки!
Поможите, чем можете!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 26 2015, 05:30
Сообщение #95


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 26 2015, 12:36
Сообщение #96


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(AHTOXA @ Mar 26 2015, 08:30) *
Напишите перед использованием объявление:
extern uint16_t Serial;

Так не пробовал. У меня же строка.
А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется.
Как-то надо создать указатели на строки в ассемблерном файле. Неужели вручную?
Сообразил:
TxBuffer_write((char *)&Serial);
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 26 2015, 13:09
Сообщение #97


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ViKo @ Mar 26 2015, 14:36) *
А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется.
" А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват".

Цитата(ViKo @ Mar 26 2015, 14:36) *
Сообразил:
TxBuffer_write((char *)&Serial);
Какое-то масло масляное. Как теперь объявлен Serial?


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Mar 26 2015, 13:14
Сообщение #98


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Сергей Борщ @ Mar 26 2015, 16:09) *
" А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват".
Какое-то масло масляное. Как теперь объявлен Serial?

Я, вроде, всё описал выше.
В startup.s:
Код
                EXPORT  Serial
                ALIGN   4
Serial          DCB     "0002",0

В Main.h:
Код
extern const char Serial;

Использую:
Код
  TxBuffer_write((char *)&Serial);
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 26 2015, 14:11
Сообщение #99


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(ViKo @ Mar 26 2015, 15:14) *
Я, вроде, всё описал выше.
Про main.h не было. И текста ругани компилятора не было. Вот так должно работать:
Код
extern const char Serial[];

  TxBuffer_write(Serial);



Цитата(ViKo @ Mar 26 2015, 15:14) *
Код
extern const char Serial;
А, тогда понятно, почему потребовалось брать адрес и грубой силой приводить его к другому типу.


--------------------
На любой вопрос даю любой ответ
"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
ViKo
сообщение Mar 26 2015, 14:53
Сообщение #100


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Сергей Борщ @ Mar 26 2015, 17:11) *
Про main.h не было. И текста ругани компилятора не было. Вот так должно работать:
[code]extern const char Serial[];

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

Новая загадка всплыла. Серийный номер нужно же сохранить при обновлении прошивки. И в расчете CRC он не должен участвовать. Эх, что-то криво все выходит...
Можно, конечно, в ту самую OTP его прописать.
upd. Но уже был прецедент - переписали номер на корпусе, чтобы солидней выглядело. Меня в известность не поставили. laughing.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 26 2015, 16:48
Сообщение #101


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Осенило - а что, если разместить серийный номер в конце сектора от загрузчика? Раз записал, номер обновил ST-Link Utility, защиту от записи установил ей же. Остальное - в основной программе.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 27 2015, 13:43
Сообщение #102


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Так и сделал. Только не в конце, а так же, после векторов прерываний.
И еще один вопросик появился. Как в startup.s передать строковую переменную, конкретно, VERSION?
Допустим, в Main.h есть #define VERSION "3.50". Как эту строку забить в ассемблерную DCB команду?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Apr 7 2015, 11:43
Сообщение #103


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



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

P.S. Скачал с ARM сайта документы, но... решил обойтись иначе. Ни к чему мне хранить строки в asm-файле. Для работы загрузчика нужно только хранить размер кода. И серийный номер буду записывать вручную по выбранному адресу, а читать чисто указателем на этот адрес.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Apr 7 2015, 14:26
Сообщение #104


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(ViKo @ Apr 7 2015, 18:43) *
Попробую спросить еще раз. Где бы почитать, как задать переменные в asm "file.s" из внешнего "defines.h"? Что-то ничего не нахожу.

С такими запросами только на IAR переходить sm.gif - он синтаксис С-препроцессора понимает.
Судя по http://infocenter.arm.com/help/index.jsp?t...sm_chebabgi.htm
можно разве что в asm-файле определить символ через GBLS, а потом передать его значение через командную строку (--predefine ... ).


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 7 2015, 14:32
Сообщение #105


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Почему "только"? sm.gif GCC тоже понимает!
(gcc -x assembler-with-cpp file.S).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

8 страниц V  « < 5 6 7 8 >
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


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


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