|
|
  |
подлинковываются вызовы _sys_xxxx в KEIL, как от этого избавиться? |
|
|
|
Dec 2 2009, 09:45
|

Частый гость
 
Группа: Свой
Сообщений: 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, но какие именно?
|
|
|
|
|
Dec 2 2009, 11:46
|

Частый гость
 
Группа: Свой
Сообщений: 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. Получается эти вызовы используются при инициализации стандартной библиотеки. Но что из моего модуля заставляет их использовать? Как это можно отловить?
|
|
|
|
|
Dec 2 2009, 14:24
|

Местный
  
Группа: Свой
Сообщений: 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
|
|
|
|
|
Dec 2 2009, 18:56
|

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

|
CRT использую стандартный, тот который с Keil идет. Да, переключился на microLib проблема ушла. В общем понял, где капать надо, буду разбираться. Насчет откуда там в инициализации SWI сказать ничего не могу. Прикрепляю окно дизассемблера, на момент когда я дошел до _sys_open(), там в каждой процедуре _sys_xxx(...) есть команда SWI. Зачем это и как работает, интересно было бы услышать от знающих. Например сейчас я вылетаю в аборт потому что на SWI висит переключение контекста FreeRTOS. Но если не использовать FreeRTOS то обычно этот вектор зациклен, как тогда будет отрабатываться эта инициализация?
Эскизы прикрепленных изображений
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|