Jump to content

    
Sign in to follow this  
poq12

непонятка с _ttywrch

Recommended Posts

Среда разработки 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:

 

2) Есть ли способ узнать максимальную глубину той части стека программы, которая используется ?

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

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

Edited by poq12

Share this post


Link to post
Share on other sites

Наехал на проблему, которая, как оказалось, здесь в точности описана, поэтому подниму тему,

авось кто из понимающих откликнется на этот раз - автор темы, например, - уж два года прошло..

 

Итак, в-кратце:

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.

 

Спасибо.

Share this post


Link to post
Share on other sites

По Вашим вопросам:

 

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 то реализуйте эти фукнции для периферии своего МК.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this