ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
3 декабря
1463037
AlexBi (13.09.2024 14:22, просмотров: 351)
Воюю с компилятором Кейла. Как же там все сложно и запутано. Возможно я иду не в том направлении? 

В общих чертах, у меня устройство на чипе Artery AT32F407. Мне надо его подключить к езернету и интернету, задействовав FreeRTOS и LWIP. Вроде бы все просто, но идет у меня тяжело. Моргать светодиодиком я быстро научился. Прилаживание FreeRTOS пошло уже не так гладко, я тут писал про свои проблемы. К счастью решение нашлось, в кейле с компилятором 6й версии надо использовать порт для GCC. все заработало. Дальше стал добавлять LWIP. Взял порт из примера у Artery, скомпилировал, запустил, не работает. Не работает на столько, что даже до моего main() не доходит, останавливается на какой-то BKPT. Стал копать интернет и выяснил, что пока я программировал всякие сравнительно мелкие м/к мои представления о стартапах С-файлов сильно устарели. Я думал там простая инициализация переменных нулями и не нулями, плюс указателей стека и кучи, а оказалось все гораздо сложнее. Туда проникли файлы-потоки из stdio (in out err), и названо это словом semihosting. Поэтому, если вдруг в вашей программе используется printf, fputc и т.п. тогда идет инициализация файлов-потоков, которая по умолчанию делается через BKPT. У меня всего этого не планируется, поэтому стал искать как избавиться от semihosting-а. Для этого есть несколько методов:

1. Можно поставить галочку "Use MicroLIB" Эта микролиб не использует семихостинг и оно все скомпилируется и будет работать. Но вычитал, что тогда не будет работать С++, а идея использовать плюсы меня еще не покинула

2. Не использовать миклолиб и не использовать в коде файлы-потоки. Меня такое устраивает, но что бы убедиться, что в коде нет использования функций семихостинга надо в любой свой файл добавить заклинание __asm(".global __use_no_semihosting"); что приведет к проверке и ошибке если что-то используется.

Я пошел по второму варианту, добавил заклинание, и получил три ошибки

.\Objects\T.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_exit was referenced

.\Objects\T.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _sys_open was referenced

.\Objects\T.axf: Error: L6915E: Library reports error: __use_no_semihosting was requested, but _ttywrch was referenced

Дальше у меня тупик. Попытка найти где эта ссылка не привела к успеху. Кейл дает таблицу ссылок в виде html-файла в котором есть ссылки что чем вызывается, но моих файлов там нет, все внутри библиотеки и приводит к initio, которое вроде как ни кем не вызывается, но все равно есть.

Нашел в интернете совет, что на эти функции можно самому написать заглушки, даже примеры нашел. Заглушки поставил, две ошибки ушло, но "..but _sys_open was referenced" все равно осталась.

Куда дальше копать не понятно.