Перейти к содержанию
    

подлинковываются вызовы _sys_xxxx в KEIL

Есть проект с использованием FreeRTOS на LPC2388.

При добавлении очередного функционального блока, который открывает соединение через сокеты LwIP, в симуляторе KEIL перестал доходить до main.

Обнаружил, что все валится на этапе инициализации процедур _sys_read/ _sys_write и т.д.

Там вызывается SWI а на нем сидит переключение контекста FreeRTOS.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть проект с использованием FreeRTOS на LPC2388.

При добавлении очередного функционального блока, который открывает соединение через сокеты LwIP, в симуляторе KEIL перестал доходить до main.

Обнаружил, что все валится на этапе инициализации процедур _sys_read/ _sys_write и т.д.

Там вызывается SWI а на нем сидит переключение контекста FreeRTOS.

 

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

Кажется, MAP-файл должен говорить, какая функция что тянет из библиотеки. Возможно, в lwip включен отладочный вывод с использованием функций из <stdio.h>.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кажется, MAP-файл должен говорить, какая функция что тянет из библиотеки. Возможно, в lwip включен отладочный вывод с использованием функций из <stdio.h>.

 

В MAP файле нашел только что эти функции линкуются, адреса куда и из какого обьектного модуля. Но кем они вызываются, или хотя бы каким моим модулем пользуются нигде не вижу.

Я много где использую stdio.h, только в нем не определены _sys_xxxx(...)

Я понимаю, что их используют какие-то процедуры из stdio.h, но какие именно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а под отладчиком пустить и посмотреть стек вызова? откуда тянется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а под отладчиком пустить и посмотреть стек вызова? откуда тянется.

 

У меня до main не доходит, по-этому смотрю по шагам в окне дизассемблера.

После инициализации стеков, идет переход на инициализацию стандартной бибилиотеки.

Среди них заходим в процедуру __rt_lib_init_stdio_2:

Внутри нее процедура _initio, там доходим до freopen, а внутри уже стоит _sys_open который и вызывает SWI.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

CRT код сами писали или чужой объектник прилюбанивается?

напишите свой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня, кажется, что-то такое было. Не доходило до main() из-за SWI в инициализации стандартной библиотеки. Я не стал разбираться, что именно вытягивало из библиотеки SWI. Просто переключил на microlib и проблемы ушли.

А список функций под подозрением, наверное, тут:

Dependencies on low-level functions

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня до 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Да, переключился на microLib проблема ушла.

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

 

Насчет откуда там в инициализации SWI сказать ничего не могу.

Прикрепляю окно дизассемблера, на момент когда я дошел до _sys_open(), там в каждой процедуре _sys_xxx(...) есть команда SWI.

Зачем это и как работает, интересно было бы услышать от знающих. Например сейчас я вылетаю в аборт потому что на SWI висит переключение контекста FreeRTOS.

Но если не использовать FreeRTOS то обычно этот вектор зациклен, как тогда будет отрабатываться эта инициализация?

post-11593-1259780172_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...