Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Купил книгу ARM7 вводный курс Тревор Мартин
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ZanozM
Давно собирался купить, и сбылось.
Стал обладателем книги Миикроконтроллеры 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 затерялась, либо где ее родную взять.
Обьясните люди добрые, если можно то как в школе для Дибилоидов.
Спасибо за ответы.
zltigo
Цитата(ZanozM @ Oct 31 2006, 18:30) *
...getchar...

getchar(), как и putchar() придется написать.
ZanozM
Да вроде 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);
}
ZanozM
Сейчас скачиваю Keil Evaluation MDK303A.EXE с его родного сайта.
Подскажите Адаптер к Российским финансовым условиям на него дейсвует?
Если нет, то где можно скачать другой Сабж.
Может скачивать нужно фулл версию? только где?
VAI
адаптация по имени клизьма здесь http://www.caxapa.ru/echo/arm.html?id=64525

А не еволюшн + еще что-то здесь
http://caxapa.ru/70942.html
Но, подозреваю (были такие основания из-за сравнения более ранних версий), что евалюшн от фулла не отличается.
Sarez
Здравствуйте!
В продолжение темы... Повторял опыт уважаемого 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 ), хотя по моему это бред.... Я понимаю , что вопрос в принципе , наверное , простой и скорее всего ответ кроется в какой-то упущенной мелочи , но обьясните тогда идиоту , что я делаю не так smile.gif
zltigo
Цитата(Sarez @ Nov 2 2006, 12:26) *
то я включаю в прект файл Serial.c , переписываю в нем функции putchar и getchar

Включать не надо, просто напишите свои и все.
ZanozM
Добрый вечер всем.
Большое спасибо VAI, за ссылки на Кеил, теперь у меня версия 3.34 причем подлеченная.
А вот на счет scanf я не догоняю.
Если можно пример, как сделать так что бы scanf заработал.
А то я уже без него собираюсь обойтись.
Dr.Craft
Здравствуйте, я тоже выкачал этот кейл, подлечил, дебаггер не жалуется, но в комплекте не оказалось 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 от прошлой версии...
Sarez
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 () .....

Обьясните , пожалуйста smile.gif
zltigo
Цитата(Sarez @ Nov 3 2006, 15:31) *
Обьясните , пожалуйста smile.gif

Какие-то кейловские нюансы :-( При наличии своих - библиотечные просто игнорируются, что собственно и было Вами oтцитировано.
Возможно у Вам нужно не getchar() писать, ибо бывает и так:
Код
#define getchar() getc(stdin)

Посмотрите по *.h файлам (начиная с stdio.h, естественно) как он в Вашем конкретном случае определен.
Sarez
Данная функция определена обычно :

extern int getchar (void);

Файл stdio.h
zltigo
Цитата(Sarez @ Nov 3 2006, 16:07) *
Файл stdio.h

Компиляторов "в комплекте" у 'Кейла' несколько, уверены, что не первый попавшийся stdio.h посмотрели?
Sarez
Использую компилятор Keil. Файл stdio.h смотрел из родной кейловской папки в директории INC. Просто интересен следующий момент - если в stdio имеется прототип getchar , то по идее код данной функции должен иметься в стандартной библиотеке и должен прикомпоноваться к моему объектному файлу. Следовательно описывать их не обязательно , а нужно только при необходимости перенаправления потоков ввода/вывода - в остальных случаях должны работать свои , встроенные в библиотеку функции. А у меня без ручного описания putchar () функция printf не работает - следовательно она не может использовать функции из библиотеки ( если , конечно , они там есть ) ?
Но если я описываю getchar самому , почему тогда keil ругается :


*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: getchar?T

Множественное определение ? Значит , вероятно , конфликтуют функция из библиотеки и описанная мной ? В принципе понятно - одинаковые имена у функций - это естественно вызывает конфликт.
Тогда почему не конфликтует putchar() ?... Непонятно.
zltigo
Цитата(Sarez @ Nov 3 2006, 17:14) *
в остальных случаях должны работать свои , встроенные в библиотеку функции.

Рабочих там нет. Только заглушки, или хуки для отладчика.
Sarez
"Рабочих там нет. Только заглушки, или хуки для отладчика."

Спасибо.

Тогда что может означать при применении scanf () :

*** ERROR L104: MULTIPLE PUBLIC DEFINITIONS
SYMBOL: getchar?T
zltigo
Цитата(Sarez @ Nov 3 2006, 17:51) *
Тогда что может означать при применении scanf () :

Да то, что и написано черным по белому :-(
Вопрос только в том правда-ли это и если правда, то где конкурент зарыт.
Sarez
Ясно. Будем проводить розыскные мероприятия. smile.gif
Спасибо большое!
leva87
А может ли кто-нибудь выкинуть примеры с диска из книги Тревора Мартина? или может кто знает где их можно скачать?
заранее спасибо!


долго не мог найти сам, а как только здесь отписался, попалась страничка и там нашел что искал
вдруг кто-то будет еще искать, так что выкладываю адрес здесь
http://www.yourdevice.net/nxp.html
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.