Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: непонятка с _ttywrch
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
poq12
Среда разработки uVision3, компилятор RealView, процессор LPC2148.

Что делалось:
Написал программу, уарт в ней не используется, операционная система тоже, никаких дополнительных библиотек типа "stdio.h , stdlib.h" не подключал. Скомпилировал, зашил, смотрю - не работает. Вижу, что не доходит до main(), смотрю дальше R14 link register и вижу в окне дизассемблера, что программа "виснет" в функции "_ttywrch". В "_ttywrch" запускается SWI и так как у меня supervisor mode никак не обрабатывается, то она бесконечно работает в SWI_HANDLER.
Смотрю хелп и вижу что _ttywrch отвечает за вывод символа в консоль. Псомотрел retarget.c файлы в хелпе. Добавил "#include <stdio.h> " и написал функцию "int fputc(int ch, FILE *f) { return (sendchar(ch));}". Скомпилировал, зашил - ура, все работает как надо.

Вопрос:
1) Почему появляется _ttywrch если у меня нигде оно не нужно в программе и нигде про него слова нет (т.е. если я не подключаю никаких библиотек) ? Должно ли так и быть или у меня где-то логическая ошибка ? laughing.gif

2) Есть ли способ узнать максимальную глубину той части стека программы, которая используется ?
Есть вариант заполнить выделенный стек одинаковыми числами и посмотреть насколько вглубь он поменяется при различных вызовах всяких разных функций.
При компиляции программы создается файл "Название проекта.htm", в котором описаны функции, стек который они используют, какие функции вызывают и кем вызываются. Т.е. получается, нужно брать бумажку и прикидывать кто-кого вызывает и сколько памяти съедает .... так ? blink.gif Если функций с десяток, то мощности мозга может и хватит ..., а что делать если их сто unsure.gif maniac.gif ? Вопрос заключается в том - правильно ли, что нужно сидеть-кропеть над этим файлом прикидывая сколько стека нужно выделить, или есть какой-нибудь волшебный способ узнать эту информацию ?
svss
Наехал на проблему, которая, как оказалось, здесь в точности описана, поэтому подниму тему,
авось кто из понимающих откликнется на этот раз - автор темы, например, - уж два года прошло..

Итак, в-кратце:
1) Стартовый код LPC2148 (Keil) чего-то желает вывести на консоль
2) Keil uVision требует, чтоб загадочное _ttywrch() присутствовало в собранном коде.

Вопросы:
1) Чего, интересно, - и зачем - Keil желает выводить на консоль, до старта (main), если его никто не просил?
2) Можно ли убрать ненужные библиотечные функции и есть ли для этого способ лучше, чем не использовать main()?

Хорошие вопросы, вестимо, содержат 50% ответа, так вот (нумерация прежняя):
1) Пример Blinky не имеет проблем на старте (и в его map-файле нет никаких следов странных библиотек), стало быть
как-то можно сделать, чтоб их не было. Вопрос - как...
2) Отказаться от main() абсолютно негуманно, поскольку проект должен собираться и другими IDE. Кроме того, тот же Blinky
стартует с main(), однако, вопреки (?) мануалу от Keil никаких _ttywrch() с ним не линкуется.

(чтоб ссылка на мануал не выглядела безадресной приведу здесь отрывок от: )
Код
5.4.2 Bare machine integer C
If you are writing a program in C that does not use the library and is to run without any
environment initialization, you must:
• Implement __rt_raise() yourself, because this error-handling function can be
called from numerous places within the compiled code.
• Not define main() to avoid linking in the library initialization code.


Спасибо.
lead_seller
По Вашим вопросам:

1) В KEIL RTX предусмотрен вывод отладочных сообщений в отладочный UART, именно многие функции системы содержат обращения к функции вывода символа в этот UART.

2) Для RTX из KEIL 4.15 проблема решалась подключением к проекту файла serial.c, который есть в том же примере Blink. Если Вы не планируете пользоваться отладочным UART, просто подключите файл serial.c из примеров в папке Keil\ARM\RL\RTX\Example (для версии 4.15, 4.23, как в 4.50 не знаю), и закомментируйте весь код в функциях, превратив их в обычные заглушки. Если планируете использовать отладочный UART то реализуйте эти фукнции для периферии своего МК.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.