Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ошибки при линковке в Кейл
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Vladimir_T
Здравствуйте, коллеги, подскажите, как устранить ошибки при линковке проекта в Кейл. Пытаюсь собрать проект с uC-FS v3.
.\List\Proj_FS.axf: Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _sys_open was referenced
.\List\Proj_FS.axf: Error: L6915E: Library reports error: __use_no_semihosting_swi was requested, but _ttywrch was referenced
defunct
Есть вот такие варианты на выбор:

1. найти и удалить все #pragma import(__use_no_semihosting_swi) и подправить зависимый от этой прагмы код.

2. использовать MicroLIB (project->options->Target->Use MicroLIB).

3. ну и самый долгий путь - в retarget.c переопределить _ttywrch как описано в хелпе (см. по ключевому слову "__use_no_semihosting_swi"), с _sys_open - сложнее, последняя потянет за собой все _sys_* функции, т.к.:
Target-dependent input and output functions use semihosting. If any function is redefined, all stream-support functions must be redefined.
Sanya_kv
Там ещё должна быть ошибка или предупреждение. Очисти и сделай полный ребилд.
Vladimir_T
[quote name='defunct' date='May 22 2009, 03:17' post='596383']
Есть вот такие варианты на выбор:

1. найти и удалить все #pragma import(__use_no_semihosting_swi) и подправить зависимый от этой прагмы код.

Эта директива только в одном месте retarget.c, в нем удалил ее. Проект слинковал. Запускаю на проце, получаю зависание, похоже из sys_io по вектору dead_swi. Почему проц вылетает?
Ведь, если я правильно понимаю, FS обеспечивает обмен с картой памяти через драйвер, где и находятся низкоуровневые функции поддержки SPI. Тогда почему вызываются SWI?
defunct
Цитата(Vladimir_T @ May 22 2009, 13:06) *
Ведь, если я правильно понимаю, FS обеспечивает обмен с картой памяти через драйвер, где и находятся низкоуровневые функции поддержки SPI. Тогда почему вызываются SWI?

Для первого варианта надо переопределить SWI обработчик в стартапе.
Закоментируйте
SWI_Handler B SWI_Handler
Добавьте
IMPORT SWI_Handler

или возьмите вариант с MircoLIB. Если сбилдится с MicroLIB - так будет даже лучше.


Цитата
Тогда почему вызываются SWI?

Потому что ARMLib по умолчанию дает вам STDIO через JTAG.
Vladimir_T
Цитата(defunct @ May 22 2009, 14:22) *
Для первого варианта надо переопределить SWI обработчик в стартапе.
Закоментируйте
SWI_Handler B SWI_Handler
Добавьте
IMPORT SWI_Handler

Так сделал, но проц так и виснет на DEAD_SWI.
Вариант с MircoLIB сбилдится с ошибками
.\List\Proj_FS.axf: Error: L6218E: Undefined symbol __use_two_region_memory (referred from str91x_startup.o).
.\List\Proj_FS.axf: Error: L6218E: Undefined symbol __initial_sp (referred from entry.o).

Где найти и как подставить эти функции?
defunct
Цитата(Vladimir_T @ May 22 2009, 17:15) *
Где найти и как подставить эти функции?

__initial_sp обычно находится в стартапе и это константа - адрес вершины стека

__use_two_region_memory см. в хелпе.

можно просто закоментировать строку
IMPORT __use_two_region_memory
Vladimir_T
Цитата(defunct @ May 23 2009, 06:08) *
__initial_sp обычно находится в стартапе и это константа - адрес вершины стека


в моем стартапе такой комстанты нет. Есть только такая инициализация:

; User Initial Stack & Heap
AREA |.text|, CODE, READONLY

; IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap

LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + USR_Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR

ESAL_Get_Stack_Top
LDR R0, =Stack_Top
BX LR



Эта константа __initial_s (referred from entry.o).
defunct
Цитата(Vladimir_T @ May 23 2009, 15:25) *
Есть только такая инициализация:

Попробуйте объявить __initial_sp как

EXPORT __initial_sp

__initial_sp EQU Stack_Mem + USR_Stack_Size
Vladimir_T
Большущее спасибо вам за помощь. Сейчас проект линкуется нормально. В отладчике проверил инициализвцию FS_Init(); и функцию FS_FormatLLIfRequired(""); . Теперь буду отлаживать низкоуровневые функции. А где можно найти описание на MicroLib для Kepl?
defunct
Цитата(Vladimir_T @ May 24 2009, 20:16) *
А где можно найти описание на MicroLib для Keil?

А все отличия описаны в help, и вот они:

The main differences between microlib and the default C library are:

Microlib is not compliant with the ISO C library standard. Some ISO features are not supported and others have less functionality.
Microlib is not compliant with the IEEE 754 standard for binary floating point arithmetic.
Microlib is highly optimized for small code size.
Locales are not configurable. The default C locale is the only one available.
main() must not be declared to take arguments and must not return.
Microlib provides limited support for C99 functions.
Microlib does not support C++.
Microlib does not support operating system functions.
Microlib does not support position-independent code.
Microlib does not provide mutex locks to guard against code that is not thread safe.
Microlib does not support wide characters or multibyte strings.
Microlib does not support selectable one or two region memory models as the standard library (stdlib) does. Microlib provides only the two region memory model with separate stack and heap regions.
Microlib can be used with either --fpmode=std or --fpmode=fast.
The level of ANSI C stdio support that is provided can be controlled with #pragma import(__use_full_stdio).
setvbuf() and setbuf() always fail because all streams are unbuffered.
feof() and ferror() always return 0 because the error and EOF indicators are not supported.
Anatrulij
Не хотел создавать новую тему - но мой вопрас относится к кейлу(точнее к его компилятору).

Есть код который компилится в других IDE (CrossWork), а Кейл выдает ошибку: error: #28 expression must have a constant value
может кто подскажит в чем проблемка

Код в прикрепленном файле(все лишнее с кода убрал)
defunct
Цитата(Anatrulij @ May 28 2009, 09:02) *
а Кейл выдает ошибку: error: #28 expression must have a constant value
может кто подскажит в чем проблемка

Keil говорит, что с радостью проинициализирует вам массив константами, а переменными он его проинициализировать не может.
Объявите массив требуемого размера, и проинициализируйте его вручную:

GUI_POINT aPointArrow[3];

aPointArrow[ 0 ].x = xCenter - pObj->Nidle.Width;
aPointArrow[ 0 ].y = yCenter;
aPointArrow[ 1 ].x = ....
...
Anatrulij
Большое спасибо.
svss
Цитата(Anatrulij @ May 28 2009, 15:10) *
Большое спасибо.

Спасибо, особенно "Большое", годится, если размер инициализации не очень. (большой)

Часто, особенно при переносе чужого проекта, помогает отказ от "--strict" следования ANSI.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.