zuy 0 1 декабря, 2009 Опубликовано 1 декабря, 2009 · Жалоба Есть проект с использованием FreeRTOS на LPC2388. При добавлении очередного функционального блока, который открывает соединение через сокеты LwIP, в симуляторе KEIL перестал доходить до main. Обнаружил, что все валится на этапе инициализации процедур _sys_read/ _sys_write и т.д. Там вызывается SWI а на нем сидит переключение контекста FreeRTOS. Я нигде явно не работаю с файлами, не использую этих _sys_xxx вызовов. Почему линкер их мне подсовывает и как от этого избавиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 2 декабря, 2009 Опубликовано 2 декабря, 2009 · Жалоба Есть проект с использованием FreeRTOS на LPC2388. При добавлении очередного функционального блока, который открывает соединение через сокеты LwIP, в симуляторе KEIL перестал доходить до main. Обнаружил, что все валится на этапе инициализации процедур _sys_read/ _sys_write и т.д. Там вызывается SWI а на нем сидит переключение контекста FreeRTOS. Я нигде явно не работаю с файлами, не использую этих _sys_xxx вызовов. Почему линкер их мне подсовывает и как от этого избавиться? Кажется, MAP-файл должен говорить, какая функция что тянет из библиотеки. Возможно, в lwip включен отладочный вывод с использованием функций из <stdio.h>. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zuy 0 2 декабря, 2009 Опубликовано 2 декабря, 2009 · Жалоба Кажется, MAP-файл должен говорить, какая функция что тянет из библиотеки. Возможно, в lwip включен отладочный вывод с использованием функций из <stdio.h>. В MAP файле нашел только что эти функции линкуются, адреса куда и из какого обьектного модуля. Но кем они вызываются, или хотя бы каким моим модулем пользуются нигде не вижу. Я много где использую stdio.h, только в нем не определены _sys_xxxx(...) Я понимаю, что их используют какие-то процедуры из stdio.h, но какие именно? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 2 декабря, 2009 Опубликовано 2 декабря, 2009 · Жалоба а под отладчиком пустить и посмотреть стек вызова? откуда тянется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zuy 0 2 декабря, 2009 Опубликовано 2 декабря, 2009 · Жалоба а под отладчиком пустить и посмотреть стек вызова? откуда тянется. У меня до main не доходит, по-этому смотрю по шагам в окне дизассемблера. После инициализации стеков, идет переход на инициализацию стандартной бибилиотеки. Среди них заходим в процедуру __rt_lib_init_stdio_2: Внутри нее процедура _initio, там доходим до freopen, а внутри уже стоит _sys_open который и вызывает SWI. Получается эти вызовы используются при инициализации стандартной библиотеки. Но что из моего модуля заставляет их использовать? Как это можно отловить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 2 декабря, 2009 Опубликовано 2 декабря, 2009 · Жалоба CRT код сами писали или чужой объектник прилюбанивается? напишите свой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 2 декабря, 2009 Опубликовано 2 декабря, 2009 · Жалоба У меня, кажется, что-то такое было. Не доходило до main() из-за SWI в инициализации стандартной библиотеки. Я не стал разбираться, что именно вытягивало из библиотеки SWI. Просто переключил на microlib и проблемы ушли. А список функций под подозрением, наверное, тут: Dependencies on low-level functions Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Quasar 20 2 декабря, 2009 Опубликовано 2 декабря, 2009 (изменено) · Жалоба У меня до 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. Изменено 2 декабря, 2009 пользователем Quasar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zuy 0 2 декабря, 2009 Опубликовано 2 декабря, 2009 · Жалоба CRT использую стандартный, тот который с Keil идет. Да, переключился на microLib проблема ушла. В общем понял, где капать надо, буду разбираться. Насчет откуда там в инициализации SWI сказать ничего не могу. Прикрепляю окно дизассемблера, на момент когда я дошел до _sys_open(), там в каждой процедуре _sys_xxx(...) есть команда SWI. Зачем это и как работает, интересно было бы услышать от знающих. Например сейчас я вылетаю в аборт потому что на SWI висит переключение контекста FreeRTOS. Но если не использовать FreeRTOS то обычно этот вектор зациклен, как тогда будет отрабатываться эта инициализация? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться