Я использую https://github.com/ARM-software/CMSIS_5/blob/develop/Device/ARM/ARMCM33/Source/startup_ARMCM33.c со следующими изменениями:
_NO_RETURN void Reset_Handler(void)
{
__set_MSPLIM((uint32_t)(&__STACK_LIMIT));
SystemInit(); /* CMSIS System Initialization */
lpuart_init(&m33_uart, (void*)LPUART0_BASE, LPUART); // Initialize LPUART
__PROGRAM_START(); /* Enter PreMain (C library entry point) */
}
__PROGRAM_START();
перейдет к _start
, который выполнит все настройки времени выполнения, упомянутые в crt0.o
, а затем перейдет к main
(см. https://embeddedartistry.com/blog/2019/04/08/a-general-обзор-о-происходит-до-основного/ для более подробной информации).
В приведенном выше фрагменте я выполняю инициализацию LPUART до _start
. После отладки .elf я узнал, что эта инициализация LPUART теряется, когда программа достигает main
. Удивительно, но эта же программа работает, если я делаю инициализацию LPUART внутри main
:
void main() {
lpuart_init(&m33_uart, (void*)LPUART0_BASE, LPUART);
/* some more code
...... */
}
Кажется, что crt0.o
делает что-то, что приведет к потере конфигурации LPUART (или платформы). Я не могу понять причину. Любая помощь?
Редактирует:
void lpuart_init(lpuart_info_t* p_info, void* base_addr, uint32_t version)
{
p_info->base_addr = base_addr;
p_info->version = version;
}
lpuart_init()
? Вы устанавливаете какие-либо глобальные переменные?I got to know that this LPUART initialization gets lost
Как именно вы определяете, что эта инициализация LPUART теряется? Что значит, что именно потерялся? - person KamilCuk   schedule 25.08.2020lpuart_init
устанавливает базовый адрес и версию терминала LPUART. Короче говоря, какой терминал будет использоваться дляprintf
. В драйвере LPUART есть переменнаяbase_addr
. Его значение должно быть 0x12345678, но становится равным 0, когда достигаетmain
. Из-за этого LPUART не будет настроен, и выполнение будет остановлено наwhile
цикле внутри драйвера. - person Niraj   schedule 25.08.2020sets base address and version
код говорит 1000 слов. Пожалуйста, предпочитайте показывать код, а не объяснять его.There is a base_addr
Определена ли эта переменная в области файла? Как было задано, вы изменяете глобальные переменные из своей функции? - person KamilCuk   schedule 25.08.2020main
. В любом случае добавил код в описание. - person Niraj   schedule 25.08.2020