poq12 0 8 февраля, 2010 Опубликовано 8 февраля, 2010 (изменено) · Жалоба Среда разработки 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: ? Вопрос заключается в том - правильно ли, что нужно сидеть-кропеть над этим файлом прикидывая сколько стека нужно выделить, или есть какой-нибудь волшебный способ узнать эту информацию ? Изменено 8 февраля, 2010 пользователем poq12 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
svss 0 12 апреля, 2012 Опубликовано 12 апреля, 2012 · Жалоба Наехал на проблему, которая, как оказалось, здесь в точности описана, поэтому подниму тему, авось кто из понимающих откликнется на этот раз - автор темы, например, - уж два года прошло.. Итак, в-кратце: 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 0 12 апреля, 2012 Опубликовано 12 апреля, 2012 · Жалоба По Вашим вопросам: 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 то реализуйте эти фукнции для периферии своего МК. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться