реклама на сайте
подробности

 
 
> Keil c51 и sprintf
crabs
сообщение Mar 20 2012, 06:14
Сообщение #1





Группа: Новичок
Сообщений: 9
Регистрация: 1-11-11
Пользователь №: 68 081



Добрый день. Столкнулся со следующей проблемой. Есть приложение, написанное для камня Si1000 в Keil. Всё отлажено и работает без нареканий. Помимо самого приложения мне понадобился бутлодер. Был написан бутлодер, приложение было сдвинуто в памяти на 2800H байт, вместе с векторами прерываний, и тд. В бутлодере, что находится в памяти начиная с нулевого адреса стоят LJMP'ы на все прерывания, которые размещены в основной программе.
После всех манипуляций программа стала зацикливаться. Как выснилось, программу вешает вызов функции sprintf() из стандартной библиотеки. Далее, по map- файлу я узнал, что зацикливается функция putchar, и в отладчике нашел место где всё останавливается. Выглядит это так:
CODE
C:0x9629 3099FD JNB TI0(0x98.1),C:9629
C:0x962C C299 CLR TI0(0x98.1)
C:0x962E F599 MOV SBUF0(0x99),A


Висяк в первой строке. То есть sprintf пытается отправить данные через последовательный порт. В программе функции вида *printf, где вызывается putchar не используются.

Менял виды оптимизации - безрезультатно. Если приложение размещается по нулевому адресу - всё ок. Как такое может быть? cranky.gif

Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
crabs
сообщение Mar 21 2012, 07:47
Сообщение #2





Группа: Новичок
Сообщений: 9
Регистрация: 1-11-11
Пользователь №: 68 081



Сделал как указано здес http://www.keil.com/support/docs/2669.htm. Оставил вместо putchar пустые заглушки, которые никуда ничего не выводят. sprintf не зацикливается но и не работает, что логично. Я в замешательстве wacko.gif

Сообщение отредактировал crabs - Mar 21 2012, 07:48
Go to the top of the page
 
+Quote Post
barabek
сообщение Mar 21 2012, 09:53
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 540
Регистрация: 16-08-07
Из: Владивосток
Пользователь №: 29 831



Цитата(crabs @ Mar 21 2012, 17:47) *
Сделал как указано здес http://www.keil.com/support/docs/2669.htm. Оставил вместо putchar пустые заглушки, которые никуда ничего не выводят. sprintf не зацикливается но и не работает, что логично. Я в замешательстве wacko.gif

Извините, что немного не в тему. А зачем Вы сдвигали основную прогу в вверх, а бутлоадер оставили внизу? При этом, как я понял, в бутлоадере Вы не используете прерывания. Смысл в этом, если при изменении проги адреса обработчиков прерываний будут плыть? Проще в начале делать ljmp на бутлоадер, а затем из него на начало основной проги.

Кстати, может в этом и проблема, что Вы каким -то образом поставили не те адреса в вектора и прогу кидает туда, куда попадать она не должна? Это я так, пальцем в небо sm.gif
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 06:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01425 секунд с 7
ELECTRONIX ©2004-2016