|
Купил книгу ARM7 вводный курс Тревор Мартин, Установил c прилаг. диска Keil mVision3v3.10b |
|
|
|
Oct 31 2006, 16:30
|
Группа: Участник
Сообщений: 7
Регистрация: 9-05-06
Пользователь №: 16 918

|
Давно собирался купить, и сбылось. Стал обладателем книги Миикроконтроллеры ARM7 Семейство LPC2000 Тревор Мартин. Так же преобретена плата LPC2106 от OLIMEX c UART0 на борту. Сразу скажу что на Си писать не приходилось. Начал маленько разбираться с примерами из книги, поморгал лампочкой , а вот на Hello World застрял. Вернее Hello World получился printf работает, а вот на scanf пишет вот такое. MODULE: C:\KEIL\ARM\LIB\CAL.LIB (getchar) DEFINED: serial.obj (serial) *** WARNING L23: UNRESOLVED EXTERNAL SYMBOLS Я так понял что библиотеки нужной нет? Нажал About вылетело C Compiler CA.exe V2.00f , а в хелпе про какой то CARM говорится где его взять ежели это и есть он, то куда библиотека CARM.lib затерялась, либо где ее родную взять. Обьясните люди добрые, если можно то как в школе для Дибилоидов. Спасибо за ответы.
|
|
|
|
|
Oct 31 2006, 21:23
|
Группа: Участник
Сообщений: 7
Регистрация: 9-05-06
Пользователь №: 16 918

|
Да вроде getchar(); работает нормально. Одиночный символ прехватывается и даже putchar(getchar()); обратно выводит считанный символ. Проблема в том что, при x=getchar(); в переменную заносится десятичный код символа ASCll. К примеру из терминальной программы с компа я хочу послать в переменную значение 1, а в итоге X=49. Может тут сделать можно чего, не преобразовывать же потом по таблице ASCll. В Serial.c написано такое. #define CR 0x0D
#include <LPC21xx.H> int putchar (int ch); int getchar (int); int putchar (int ch) { /* Write character to Serial Port */
if (ch == '\n') { while (!(U0LSR & 0x20)); U0THR = CR; /* output CR */ } while (!(U0LSR & 0x20));
return (U0THR = ch); } int getchar (int) { /* Read character from Serial Port */
while (!(U0LSR & 0x01));
return (U0RBR); }
|
|
|
|
|
Oct 31 2006, 21:45
|
Группа: Участник
Сообщений: 7
Регистрация: 9-05-06
Пользователь №: 16 918

|
Сейчас скачиваю Keil Evaluation MDK303A.EXE с его родного сайта. Подскажите Адаптер к Российским финансовым условиям на него дейсвует? Если нет, то где можно скачать другой Сабж. Может скачивать нужно фулл версию? только где?
|
|
|
|
|
Nov 2 2006, 10:26
|
Частый гость
 
Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630

|
Здравствуйте! В продолжение темы... Повторял опыт уважаемого ZanozM. Появился ряд вопросов. Во первых , как я понимаю , функционирует это все следующим образом : 1) Имеются функции высокого уровня printf и scanf , отвечающие за ввод и вывод строки символов. Для этого они используют функции низкого уровня putchar и getchar , которые в свою очередь работают с регистрами различной переферии МК ( по умолчанию UART0). Если я хочу перенаправить потоки ввода/вывода с UART0 на другую переферию ( для простоты допустим UART1), то я включаю в прект файл Serial.c , переписываю в нем функции putchar и getchar так , как необходимо мне . Т.к в STDIO данные функции описаны как extern , то соответственно никаких проблем с ними быть не должно. Далее использую функции printf и scanf , которым абсолютно неважно , КУДА выводить поток символов , так как этот вопрос решают putchar и getchar 2) Данные функции являются библиотечными , прототипы в файле STDIO.H , следовательно , если передо мной не стоит задачи перенаправления потока символов , то я могу просто использовать printf и scanf , без описания putchar и getchar ? По идее , поскольку прототипы putchar и getchar описаны в STDIO , то они должны быть в библиотеке и на этапе компоновки добавлятся к моему объектному файлу... Если поток надо перенаправить - включаю и редактирую Serial.c ( которого , почему-то в папке LIB не нашел , лежит только putchar.c .... ). Или же код данных функций ( putchar и getchar )ВСЕГДА необходимо описывать самому , включая каждый раз в проект соответствующий файл? Сразу оговорюсь , что включая STDIO.H и пытаясь использовать printf без включения Serial.c и описания putchar результатов не дает - вывода символов в симуляторе я не получил. Далее включаю Serial.c описываю putchar - printf работает - идет вывод вводимых с клавиатуры символов на экран симулятора. ОПИСЫВАЮ В Serial.s GETCHAR - компилирую - получаю неизменно превосходный результат : *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: getchar?T MODULE: C:\KEIL\ARM\LIB\CAL.LIB (getchar) DEFINED: serial.obj (serial) *** WARNING L23: UNRESOLVED EXTERNAL SYMBOLS Program Size: data=1172 const=37 code=282 Target not created Что собственно и наблюдал у себя да экране уважаемый ZanozM. Заинтересовала фраза : ERROR L104: MULTIPLE PUBLIC DEFINITIONS - насколько я понимаю - множественное определение ? Комментируешь функцию getchar - все нормально , за исключением того , что scanf не работает.... Напрашивается возможный ответ , что конфликтует функция getchar в библиотеке и getchar в Serial.c , хотя возможно я неправ... и почему тогда не конфликтует putchar ? Или же предполагается , что можно редактировать только функцию putchar , без возможности редактирования getchar ( этим можно с натяжкой попытаться обьяснить наличие в папке LIB только файла putchar.c ), хотя по моему это бред.... Я понимаю , что вопрос в принципе , наверное , простой и скорее всего ответ кроется в какой-то упущенной мелочи , но обьясните тогда идиоту , что я делаю не так
|
|
|
|
|
Nov 2 2006, 16:08
|
Группа: Участник
Сообщений: 7
Регистрация: 9-05-06
Пользователь №: 16 918

|
Добрый вечер всем. Большое спасибо VAI, за ссылки на Кеил, теперь у меня версия 3.34 причем подлеченная. А вот на счет scanf я не догоняю. Если можно пример, как сделать так что бы scanf заработал. А то я уже без него собираюсь обойтись.
|
|
|
|
|
Nov 2 2006, 16:32
|
Группа: Участник
Сообщений: 10
Регистрация: 27-05-06
Из: Новосибирск
Пользователь №: 17 495

|
Здравствуйте, я тоже выкачал этот кейл, подлечил, дебаггер не жалуется, но в комплекте не оказалось CARMа, выкачал недостающие файлы: http://caxapa.ru/71537.html Все работает до 16К, дальше линкер ругается: linking... LARM LINKER/LOCATER V2.54a - SN: Eval Version COPYRIGHT KEIL ELEKTRONIK GmbH 2001 - 2006 @test.lnp "Startup.obj", "Serial.obj", "main.obj" TO "test" CODE IXREF CASE CLASSES (DATA (0x40000000-0x40003FFF, 0x81000000-0x810FFFFF), CODE (0x0-0x3FFFF), CONST (0x0-0x3FFFF)) *** ERROR L210: I/O ERROR ON INPUT FILE: EXCEPTION 0021H: PATH OR FILE NOT FOUND FILE: C:\KEIL\ARM\LIB\CALDP.LIB Target not created Объектники удалял, в TOOLS.INF прописывал - не помогает Смущает то, что файлы CARMa от прошлой версии...
|
|
|
|
|
Nov 3 2006, 13:31
|
Частый гость
 
Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630

|
to zltigo Спасибо Вам большое за ответ. Но к сожалению , опять не вышло.... "....Включать не надо, просто напишите свои и все....." Уточните пожалуйста , что имеется в виду ? Если имеется в виду отредактировать и сохранить в папке LIB файл Serial.s , содержащий putchar и getchar в том виде , которые мне необходимы , то это ни к чему не привело - на printf и scanf компилятор не ругается , но ничего и не выводится , т.е вероятно данные функции не работают..( ? ) Если описывать putchar и getchar непосредственно в коде основного файла : #include <LPC21xx.H> #include <stdio.h> #define CR 0x0D void UART0 (void); // Прототип функции инициализации int putchar (int ch); int getchar (void); char my; int main(void) { UART0 (); //Инициализация UART printf("\n Введите значение \n" ); while(1) { scanf (" %d ", &my); } } // Определения void UART0 (void) { PINSEL0 = 0x05; U0LCR = 0x80; U0DLL = 0xC2; U0DLM = 0x00; U0LCR = 0x33; U0FCR = 0x4F; } int putchar (int ch) { if (ch == '\n') { while (!(U0LSR & 0x20)); U0THR = CR; /* output CR */ } while (!(U0LSR & 0x20)); return (U0THR = ch); } int getchar (void) { while (!(U0LSR & 0x01)); return (U0RBR); } То в этом случае получаем : linking... *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: putchar?A MODULE: C:\KEIL\ARM\LIB\CAL.LIB (putchar) DEFINED: main.obj (main) *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: getchar?A MODULE: C:\KEIL\ARM\LIB\CAL.LIB (getchar) DEFINED: main.obj (main) *** WARNING L23: UNRESOLVED EXTERNAL SYMBOLS Program Size: data=1173 const=34 code=282 Target not created Что и понятно , поскольку вероятно функции с такими же именами присутствуют в библиотеке и соответственно возникает конфликт. Или я не прав? Если же я включаю в состав проекта файл Serial.c и описываю в нем функцию putchar , то printf работает без проблем. Описываю в этом же файле ( Serial.c ) функцию getchar , не вызывая при этом нигде в программе функции scanf - аналогично... ВЫЗЫВАЮ ФУНКЦИЮ SCANF -получаю: compiling main.c... linking... *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYMBOL: getchar?T MODULE: C:\KEIL\ARM\LIB\CAL.LIB (getchar) DEFINED: serial.obj (serial) *** WARNING L23: UNRESOLVED EXTERNAL SYMBOLS Program Size: data=1173 const=51 code=282 Target not created Чувствую себя идиотом ( хотя возможно так и есть ) - но не могу понять , что я делаю неправильно... Открываю книгу Тревора Мартина - читаю : ".... Для передачи и приема одиночных символов в/из стандартного устройства ( в данном случае UART ) в библиотеке STDIO используются две низкоуровневые функции . Эти функции называются putchar() и getchar() , а их исходный код находится в файле serial.c в директории lib. Если присоеденить этот файл к своему проекту , то библиотека , используемая компилятором по умолчанию , будет игнорироваться, а вместо нее будет использоваться код из файла serial.c . Таким образом, модифицируя подпрограммы putchar() и getchar(), можно перенаправить функции высокого уровня printf() и scanf() на любое устройство ввода/вывода, которое вы собираетесь использовать , такое как ЖК индикатор и клавиатура. ........." Все вроде понятно... но : 1) В директории lib у меня НЕТ файла serial.c , а ТОЛЬКО файл putchar.c 2) Соответственно работает у меня только printf () ..... Обьясните , пожалуйста
|
|
|
|
|
Nov 3 2006, 13:55
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Sarez @ Nov 3 2006, 15:31)  Обьясните , пожалуйста  Какие-то кейловские нюансы :-( При наличии своих - библиотечные просто игнорируются, что собственно и было Вами oтцитировано. Возможно у Вам нужно не getchar() писать, ибо бывает и так: Код #define getchar() getc(stdin) Посмотрите по *.h файлам (начиная с stdio.h, естественно) как он в Вашем конкретном случае определен.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|