ViKo 1 25 марта, 2015 Опубликовано 25 марта, 2015 · Жалоба Теперь подвис на том, как размер кода задать в самом коде. Как здесь писали, после векторов прерываний разместить, например. С помощью линкера (Кейл). Вариант 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 25 марта, 2015 Опубликовано 25 марта, 2015 · Жалоба upd. "Нашел" дыру в стартапе. Как, пойдет?Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 марта, 2015 Опубликовано 25 марта, 2015 · Жалоба Пойдет, но я бы не экономил. Потом когда-нибудь будете портировать на более продвинутый кортекс у которого это место в таблице занято и будете долго искать причину неработы. Это раз. Второе - будет довольно сложно заставить линкер класть размер в уже занятое векторами место. А сразу за векторами никто ему мешать не будет. Полистал книжку по Cortex-M4, там тоже дыра. Можно и после векторов прерываний разместить, но и там сдвиг возможен в новых микроконтроллерах, даже с большей вероятностью. Линкером класть не умею (вернее, вычислять размер не умею). Буду своей программой записывать, туда же CRC, туда же и серийный номер. STM32 ST-Link Utility умеет перезаписывать флэш (ей серийный номер и обновляю). Э-э, CRC туда поместить нельзя. Иначе при расчете нужно проскакивать ее. Ее лучше в конец приписать, чтобы полный расчет дал 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 25 марта, 2015 Опубликовано 25 марта, 2015 · Жалоба Пробую разместить строки в startup.s, чтобы знать точное место. Добавил после определения векторов: EXPORT Serial ALIGN 4 Serial DCB "0000", 0 Вижу в выходном коде свои строки, если к ним нет обращения. Но не видит программа этих переменных из c-файлов, и не компилируется из-за ошибки! Поможите, чем можете! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Напишите перед использованием объявление: extern uint16_t Serial; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Напишите перед использованием объявление: extern uint16_t Serial; Так не пробовал. У меня же строка. А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется. Как-то надо создать указатели на строки в ассемблерном файле. Неужели вручную? Сообразил: TxBuffer_write((char *)&Serial); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба А extern char *Serial; компилируется, но не работает. Потому что не указатель. А extern char[] Serial не компилируется." А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват". Сообразил: TxBuffer_write((char *)&Serial); Какое-то масло масляное. Как теперь объявлен Serial? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба " А кто из телепатов не догадался, что там у меня в исходнике и как ругается компилятор - я не виноват". Какое-то масло масляное. Как теперь объявлен Serial? Я, вроде, всё описал выше. В startup.s: EXPORT Serial ALIGN 4 Serial DCB "0002",0 В Main.h: extern const char Serial; Использую: TxBuffer_write((char *)&Serial); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 117 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Я, вроде, всё описал выше.Про main.h не было. И текста ругани компилятора не было. Вот так должно работать: extern const char Serial[]; TxBuffer_write(Serial); extern const char Serial; А, тогда понятно, почему потребовалось брать адрес и грубой силой приводить его к другому типу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Про main.h не было. И текста ругани компилятора не было. Вот так должно работать: extern const char Serial[]; Это я попутал с C#, не туда скобки присобачил. :rolleyes: Дал маху. Пишу параллельно шифровщик прошивки на компьютере. Новая загадка всплыла. Серийный номер нужно же сохранить при обновлении прошивки. И в расчете CRC он не должен участвовать. Эх, что-то криво все выходит... Можно, конечно, в ту самую OTP его прописать. upd. Но уже был прецедент - переписали номер на корпусе, чтобы солидней выглядело. Меня в известность не поставили. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 26 марта, 2015 Опубликовано 26 марта, 2015 · Жалоба Осенило - а что, если разместить серийный номер в конце сектора от загрузчика? Раз записал, номер обновил ST-Link Utility, защиту от записи установил ей же. Остальное - в основной программе. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 27 марта, 2015 Опубликовано 27 марта, 2015 · Жалоба Так и сделал. Только не в конце, а так же, после векторов прерываний. И еще один вопросик появился. Как в startup.s передать строковую переменную, конкретно, VERSION? Допустим, в Main.h есть #define VERSION "3.50". Как эту строку забить в ассемблерную DCB команду? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 7 апреля, 2015 Опубликовано 7 апреля, 2015 · Жалоба Попробую спросить еще раз. Где бы почитать, как задать переменные в asm "file.s" из внешнего "defines.h"? Что-то ничего не нахожу. P.S. Скачал с ARM сайта документы, но... решил обойтись иначе. Ни к чему мне хранить строки в asm-файле. Для работы загрузчика нужно только хранить размер кода. И серийный номер буду записывать вручную по выбранному адресу, а читать чисто указателем на этот адрес. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 7 апреля, 2015 Опубликовано 7 апреля, 2015 · Жалоба Попробую спросить еще раз. Где бы почитать, как задать переменные в asm "file.s" из внешнего "defines.h"? Что-то ничего не нахожу. С такими запросами только на IAR переходить :) - он синтаксис С-препроцессора понимает. Судя по http://infocenter.arm.com/help/index.jsp?t...sm_chebabgi.htm можно разве что в asm-файле определить символ через GBLS, а потом передать его значение через командную строку (--predefine ... ). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 14 7 апреля, 2015 Опубликовано 7 апреля, 2015 · Жалоба Почему "только"? :) GCC тоже понимает! (gcc -x assembler-with-cpp file.S). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться