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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Купил книгу ARM7 вводный курс Тревор Мартин, Установил c прилаг. диска Keil mVision3v3.10b
ZanozM
сообщение Oct 31 2006, 16:30
Сообщение #1





Группа: Участник
Сообщений: 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 затерялась, либо где ее родную взять.
Обьясните люди добрые, если можно то как в школе для Дибилоидов.
Спасибо за ответы.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Oct 31 2006, 20:28
Сообщение #2


Гуру
******

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



Цитата(ZanozM @ Oct 31 2006, 18:30) *
...getchar...

getchar(), как и putchar() придется написать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ZanozM
сообщение Oct 31 2006, 21:23
Сообщение #3





Группа: Участник
Сообщений: 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);
}
Go to the top of the page
 
+Quote Post
ZanozM
сообщение Oct 31 2006, 21:45
Сообщение #4





Группа: Участник
Сообщений: 7
Регистрация: 9-05-06
Пользователь №: 16 918



Сейчас скачиваю Keil Evaluation MDK303A.EXE с его родного сайта.
Подскажите Адаптер к Российским финансовым условиям на него дейсвует?
Если нет, то где можно скачать другой Сабж.
Может скачивать нужно фулл версию? только где?
Go to the top of the page
 
+Quote Post
VAI
сообщение Nov 1 2006, 06:08
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



адаптация по имени клизьма здесь http://www.caxapa.ru/echo/arm.html?id=64525

А не еволюшн + еще что-то здесь
http://caxapa.ru/70942.html
Но, подозреваю (были такие основания из-за сравнения более ранних версий), что евалюшн от фулла не отличается.


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
Sarez
сообщение Nov 2 2006, 10:26
Сообщение #6


Частый гость
**

Группа: Новичок
Сообщений: 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 ), хотя по моему это бред.... Я понимаю , что вопрос в принципе , наверное , простой и скорее всего ответ кроется в какой-то упущенной мелочи , но обьясните тогда идиоту , что я делаю не так smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 2 2006, 13:21
Сообщение #7


Гуру
******

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



Цитата(Sarez @ Nov 2 2006, 12:26) *
то я включаю в прект файл Serial.c , переписываю в нем функции putchar и getchar

Включать не надо, просто напишите свои и все.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ZanozM
сообщение Nov 2 2006, 16:08
Сообщение #8





Группа: Участник
Сообщений: 7
Регистрация: 9-05-06
Пользователь №: 16 918



Добрый вечер всем.
Большое спасибо VAI, за ссылки на Кеил, теперь у меня версия 3.34 причем подлеченная.
А вот на счет scanf я не догоняю.
Если можно пример, как сделать так что бы scanf заработал.
А то я уже без него собираюсь обойтись.
Go to the top of the page
 
+Quote Post
Dr.Craft
сообщение Nov 2 2006, 16:32
Сообщение #9





Группа: Участник
Сообщений: 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 от прошлой версии...
Go to the top of the page
 
+Quote Post
Sarez
сообщение Nov 3 2006, 13:31
Сообщение #10


Частый гость
**

Группа: Новичок
Сообщений: 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 () .....

Обьясните , пожалуйста smile.gif
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 3 2006, 13:55
Сообщение #11


Гуру
******

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



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

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

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Sarez
сообщение Nov 3 2006, 14:07
Сообщение #12


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



Данная функция определена обычно :

extern int getchar (void);

Файл stdio.h
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 3 2006, 14:27
Сообщение #13


Гуру
******

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



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

Компиляторов "в комплекте" у 'Кейла' несколько, уверены, что не первый попавшийся stdio.h посмотрели?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Sarez
сообщение Nov 3 2006, 15:14
Сообщение #14


Частый гость
**

Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630



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


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

Множественное определение ? Значит , вероятно , конфликтуют функция из библиотеки и описанная мной ? В принципе понятно - одинаковые имена у функций - это естественно вызывает конфликт.
Тогда почему не конфликтует putchar() ?... Непонятно.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 3 2006, 15:34
Сообщение #15


Гуру
******

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



Цитата(Sarez @ Nov 3 2006, 17:14) *
в остальных случаях должны работать свои , встроенные в библиотеку функции.

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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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