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

 
 
 
Reply to this topicStart new topic
> подлинковываются вызовы _sys_xxxx в KEIL, как от этого избавиться?
zuy
сообщение Dec 1 2009, 23:08
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593



Есть проект с использованием FreeRTOS на LPC2388.
При добавлении очередного функционального блока, который открывает соединение через сокеты LwIP, в симуляторе KEIL перестал доходить до main.
Обнаружил, что все валится на этапе инициализации процедур _sys_read/ _sys_write и т.д.
Там вызывается SWI а на нем сидит переключение контекста FreeRTOS.

Я нигде явно не работаю с файлами, не использую этих _sys_xxx вызовов. Почему линкер их мне подсовывает и как от этого избавиться?
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 2 2009, 07:48
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

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

Кажется, MAP-файл должен говорить, какая функция что тянет из библиотеки. Возможно, в lwip включен отладочный вывод с использованием функций из <stdio.h>.
Go to the top of the page
 
+Quote Post
zuy
сообщение Dec 2 2009, 09:45
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593



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


В MAP файле нашел только что эти функции линкуются, адреса куда и из какого обьектного модуля. Но кем они вызываются, или хотя бы каким моим модулем пользуются нигде не вижу.
Я много где использую stdio.h, только в нем не определены _sys_xxxx(...)
Я понимаю, что их используют какие-то процедуры из stdio.h, но какие именно?
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 2 2009, 10:10
Сообщение #4


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



а под отладчиком пустить и посмотреть стек вызова? откуда тянется.
Go to the top of the page
 
+Quote Post
zuy
сообщение Dec 2 2009, 11:46
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593



Цитата(klen @ Dec 2 2009, 14:10) *
а под отладчиком пустить и посмотреть стек вызова? откуда тянется.


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

Получается эти вызовы используются при инициализации стандартной библиотеки. Но что из моего модуля заставляет их использовать? Как это можно отловить?
Go to the top of the page
 
+Quote Post
klen
сообщение Dec 2 2009, 12:25
Сообщение #6


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



CRT код сами писали или чужой объектник прилюбанивается?
напишите свой.
Go to the top of the page
 
+Quote Post
scifi
сообщение Dec 2 2009, 14:13
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



У меня, кажется, что-то такое было. Не доходило до main() из-за SWI в инициализации стандартной библиотеки. Я не стал разбираться, что именно вытягивало из библиотеки SWI. Просто переключил на microlib и проблемы ушли.
А список функций под подозрением, наверное, тут:
Dependencies on low-level functions
Go to the top of the page
 
+Quote Post
Quasar
сообщение Dec 2 2009, 14:24
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 257
Регистрация: 2-12-06
Из: Default City
Пользователь №: 23 021



Цитата(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.

Сообщение отредактировал Quasar - Dec 2 2009, 14:26
Go to the top of the page
 
+Quote Post
zuy
сообщение Dec 2 2009, 18:56
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 173
Регистрация: 30-11-05
Из: San Francisco
Пользователь №: 11 593



CRT использую стандартный, тот который с Keil идет.

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

Насчет откуда там в инициализации SWI сказать ничего не могу.
Прикрепляю окно дизассемблера, на момент когда я дошел до _sys_open(), там в каждой процедуре _sys_xxx(...) есть команда SWI.
Зачем это и как работает, интересно было бы услышать от знающих. Например сейчас я вылетаю в аборт потому что на SWI висит переключение контекста FreeRTOS.
Но если не использовать FreeRTOS то обычно этот вектор зациклен, как тогда будет отрабатываться эта инициализация?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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