Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: подлинковываются вызовы _sys_xxxx в KEIL
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zuy
Есть проект с использованием FreeRTOS на LPC2388.
При добавлении очередного функционального блока, который открывает соединение через сокеты LwIP, в симуляторе KEIL перестал доходить до main.
Обнаружил, что все валится на этапе инициализации процедур _sys_read/ _sys_write и т.д.
Там вызывается SWI а на нем сидит переключение контекста FreeRTOS.

Я нигде явно не работаю с файлами, не использую этих _sys_xxx вызовов. Почему линкер их мне подсовывает и как от этого избавиться?
scifi
Цитата(zuy @ Dec 2 2009, 02:08) *
Есть проект с использованием FreeRTOS на LPC2388.
При добавлении очередного функционального блока, который открывает соединение через сокеты LwIP, в симуляторе KEIL перестал доходить до main.
Обнаружил, что все валится на этапе инициализации процедур _sys_read/ _sys_write и т.д.
Там вызывается SWI а на нем сидит переключение контекста FreeRTOS.

Я нигде явно не работаю с файлами, не использую этих _sys_xxx вызовов. Почему линкер их мне подсовывает и как от этого избавиться?

Кажется, MAP-файл должен говорить, какая функция что тянет из библиотеки. Возможно, в lwip включен отладочный вывод с использованием функций из <stdio.h>.
zuy
Цитата(scifi @ Dec 2 2009, 11:48) *
Кажется, MAP-файл должен говорить, какая функция что тянет из библиотеки. Возможно, в lwip включен отладочный вывод с использованием функций из <stdio.h>.


В MAP файле нашел только что эти функции линкуются, адреса куда и из какого обьектного модуля. Но кем они вызываются, или хотя бы каким моим модулем пользуются нигде не вижу.
Я много где использую stdio.h, только в нем не определены _sys_xxxx(...)
Я понимаю, что их используют какие-то процедуры из stdio.h, но какие именно?
klen
а под отладчиком пустить и посмотреть стек вызова? откуда тянется.
zuy
Цитата(klen @ Dec 2 2009, 14:10) *
а под отладчиком пустить и посмотреть стек вызова? откуда тянется.


У меня до main не доходит, по-этому смотрю по шагам в окне дизассемблера.
После инициализации стеков, идет переход на инициализацию стандартной бибилиотеки.
Среди них заходим в процедуру __rt_lib_init_stdio_2:
Внутри нее процедура _initio, там доходим до freopen, а внутри уже стоит _sys_open который и вызывает SWI.

Получается эти вызовы используются при инициализации стандартной библиотеки. Но что из моего модуля заставляет их использовать? Как это можно отловить?
klen
CRT код сами писали или чужой объектник прилюбанивается?
напишите свой.
scifi
У меня, кажется, что-то такое было. Не доходило до main() из-за SWI в инициализации стандартной библиотеки. Я не стал разбираться, что именно вытягивало из библиотеки SWI. Просто переключил на microlib и проблемы ушли.
А список функций под подозрением, наверное, тут:
Dependencies on low-level functions
Quasar
Цитата(zuy @ Dec 2 2009, 14:46) *
У меня до main не доходит, по-этому смотрю по шагам в окне дизассемблера.
После инициализации стеков, идет переход на инициализацию стандартной бибилиотеки.
Среди них заходим в процедуру __rt_lib_init_stdio_2:
Внутри нее процедура _initio, там доходим до freopen, а внутри уже стоит _sys_open который и вызывает SWI.

Получается эти вызовы используются при инициализации стандартной библиотеки. Но что из моего модуля заставляет их использовать? Как это можно отловить?


Он пытается открыть STDIN/STDOUT/STDERR, только почему она у вас SWI вызывает я чего-то не пойму.
Можно реализовать функции:
Код
#pragma import(__use_no_semihosting_swi)
int _sys_open(const char *name,int mode);
int _sys_close(FILEHANDLE fh);
int _sys_write(FILEHANDLE fh, const unsigned char * buf,unsigned len, int mode);
int _sys_read(FILEHANDLE fh, unsigned char * buf,unsigned len, int mode);

Сделайте их пустыми, возвращающими 0 должно начать доходить до main.
zuy
CRT использую стандартный, тот который с Keil идет.

Да, переключился на microLib проблема ушла.
В общем понял, где капать надо, буду разбираться.

Насчет откуда там в инициализации SWI сказать ничего не могу.
Прикрепляю окно дизассемблера, на момент когда я дошел до _sys_open(), там в каждой процедуре _sys_xxx(...) есть команда SWI.
Зачем это и как работает, интересно было бы услышать от знающих. Например сейчас я вылетаю в аборт потому что на SWI висит переключение контекста FreeRTOS.
Но если не использовать FreeRTOS то обычно этот вектор зациклен, как тогда будет отрабатываться эта инициализация?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.