Перейти к содержанию
    

непонятка с _ttywrch

Среда разработки 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: ? Вопрос заключается в том - правильно ли, что нужно сидеть-кропеть над этим файлом прикидывая сколько стека нужно выделить, или есть какой-нибудь волшебный способ узнать эту информацию ?

Изменено пользователем poq12

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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.

 

Спасибо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...