|
IAR от новичка, помогите студенту |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Mar 26 2006, 08:30
|

Знающий
   
Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294

|
То что вы приложили это не проект а ассемблерные исходники. Вообще ваша проблема кроется в настройках опий проекта. Project-Option-Linker-Config- здесь надо поставить галку Override defualt program entry (Defined by application). Прилагаю готовый проект, который создан в ИАР 3.30A Кстати не забудьте в опициях проекта правильно указвывать тип используемого процессора. P.S. файла не прикрепляется. Положил сюда. http://upload.caxapa.ru/clock.zip
--------------------
летаю на пепелаце...
|
|
|
|
|
Apr 1 2006, 21:49
|
Участник

Группа: Свой
Сообщений: 43
Регистрация: 26-01-06
Из: Минск, Беларусь
Пользователь №: 13 651

|
У меня тож проблемка, даже стыдно новую тему заводить  Разбил программу на несколько файлов (сделал .c и .h), в main.cpp указал #include заголовочные файлы, указал пути в Options->C compiler->Preprocessor и Linker->Config->Search Path, а проект не запускается. Подозреваю, что ещё где-то надо что-то указать, но что и где - никак не соображу. Подскажите, пожалуйста... ЗЫ: Error[e46]: Undefined external "i2c_write_byte(char)" referred in main ( H:\Programming\Projects\Termometr\IAR\Debug\Obj\main.r43 ) итд итп...
|
|
|
|
|
Apr 1 2006, 22:28
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
//Nikson, вам нужно в каждый исходный файл включать прототипы используемых, но не описанных в нем, функций с опцией extern. Типа Код extern void i2c_write_byte(char);
|
|
|
|
|
Apr 3 2006, 16:50
|
Участник

Группа: Свой
Сообщений: 43
Регистрация: 26-01-06
Из: Минск, Беларусь
Пользователь №: 13 651

|
Нет, всё равно что-то не получается. Вот по порядку что я делаю: 1. Создаю .с и .h файлы. В первом реализации функций, во втором - их прототипы и определения констант 2. в основной программе #include заголовочный файл - проект не компилируется - Undefined external... 3. дописываю в основной программе внешние функции как extern - опять Undefined external, кстати ошибку выдаёт IAR Universal Linker V4.59F/386 4. Добавляю файл в проект: Project - Add File. Теперь в папке /Obj лежат 2 файла: main.r43 и i2c_soft.r43, но ошибки те же. То есть похоже, что по-отдельности файлы компилируются в 2 объектных модуля, но как их объединить в один файл??? На всякий случай ещё в настройках Linker - Search Path указал $OBJ_DIR$\ и $PROJ_DIR$\, то же самое в Compiler - Include Paths. Ничего не помогает, а больше ничего придумать не могу...  Или где-то настройки проекта покрутить надо, или во внешних файлах дописать (маловероятно - что там такого писать), или в основной программе (extern и прототипы уже написал...)... В общем, если кто что подскажет - буду рад :!:
|
|
|
|
|
Apr 3 2006, 17:05
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
В проект естественно нужно включать оба файла. Они компилируются в два разных объектника и объединяются только уже в самой прошивке. Чтобы оба хидера можно было было вставить в один исходный файл, его (.h-файл) нужно писать с директивами условной компиляции. Типа Код #ifndef _I2C_MODULE #define I2C_SLAVE_ADDERSS 0xA0 #define _I2C_MODULE 1 #endif extern void i2c_write_byte(char); Вот такой хидер можно инклюдить в оба файла и никаких проблем не будет. P.S. если бы вы приложили свои исходники, то "указать пальцем" было бы проще
|
|
|
|
|
Apr 4 2006, 18:38
|
Участник

Группа: Свой
Сообщений: 43
Регистрация: 26-01-06
Из: Минск, Беларусь
Пользователь №: 13 651

|
значит так... вот что имеется. кусок i2c_soft.h: Код #include <msp430x14x.h>
#ifndef _I2C_MODULE #define _I2C_MODULE 1
//--------------- I2C definitions begin ----------- ........ //--------------- I2C definitions end -------------
extern void i2c_stop(void); extern void i2c_start(void); extern void i2c_receive(char device, char sub_addr, int length, char *data); extern void i2c_send(char device, char sub_addr, int length, char *data); extern void i2c_init(void); extern char i2c_read_byte(unsigned char last); extern unsigned char i2c_write_byte(char b);
#endif кусок i2c_soft.c: Код #include "i2c_soft.h"
//-------------- I2C functions start --------------- ..... //-------------- i2C functions end ------------------ и кусок main.cpp: Код #include <msp430x14x.h> #include "i2c_soft.h"
.....
extern void i2c_stop(void); extern void i2c_start(void); extern void i2c_receive(char device, char sub_addr, int length, char *data); extern void i2c_send(char device, char sub_addr, int length, char *data); extern void i2c_init(void); extern char i2c_read_byte(unsigned char last); extern unsigned char i2c_write_byte(char b);
...... всё это можно посмотреть в полном варианте в присоединённом архиве. все внешние файлы подключены через Project - Add File. чувствую, что где-то облажался, но ГДЕ?....
|
|
|
|
|
Apr 4 2006, 22:05
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Блин! Зачем main.cpp назвали, да еще и в опциях язык Automatic (Extention based) выбрали? У вас же нет плюсового ничего. В общем, изменив одну лишь опцию в свойствах проекта, все начинает компилироваться Options->C/C++ Compiler->Language->Embedded C++. Либо можете оставить так как сейчас есть, но в исходнике соответствующую прагму с указанием языка используйте. Кстати, хидеры отдельно в проект включать не нужно. P.S. еще один вариант, когда с хидерами/модулями не получается. Инклюдить в модуль с функцией main не только хидер, а весь исходник модуля. То бишь во второй строке вместо Код #include "i2c_soft.h" напишите Код #include "i2c_soft.c" P.P.S. для подобных проектов я библиотеку Legacy C (CLIB) использую. Плюсового у вас тут ничего пока не наблюдается. А из библотеки DLIB, только определения true и false используются. Но их легко самому определить. Типа такого Код typedef unsigned char Bool; #define false ((Bool)0x00) #define true ((Bool)0xFF) ну или сами тип придумайте или подсмотрите где.
|
|
|
|
|
Apr 5 2006, 19:16
|
Участник

Группа: Свой
Сообщений: 43
Регистрация: 26-01-06
Из: Минск, Беларусь
Пользователь №: 13 651

|
rezident, Ура! Теперь всё работает. Даже обидно - столько времени "биться головой" из-за такой мелочи Спасибо огромное что нашли время и посмотрели! Теперь можно продвигаться дальше. В поисках новых ошибок  (А они уже есть, просто сам поковыряться пока хочу) P.S. Цитата Зачем main.cpp назвали, да еще и в опциях язык Automatic (Extention based) выбрали? Больше не буду, честно.
|
|
|
|
|
Apr 9 2006, 13:41
|
Частый гость
 
Группа: Участник
Сообщений: 86
Регистрация: 17-01-06
Из: иркутск
Пользователь №: 13 278

|
АДИКМ СПАСИБО, что прояснили мой вопрос, проблема действительно состояла в неправильных настройках опций проекта. Однако при анализе представленного вами проекта у меня возникло ещё два небольших вопроса: 1. При попытке просмотра в окне Watch информации о символах SEC,MIN,HR выводится надпись: Error: Unknown or ambiguous symbol. Почему так происходит? 2. Симуляция прерывания организуется в окне Simulator-Interrupts. Однако в этом случае приходится указывать значения таких параметров, как First Activation, Repeat interval, Hold time,Probability,Variance.Отсюда возникает вопрос: есть ли способ симулировать прерывание так , как это указанно в исходном тексте программы (т.е. применительно к вашему проекту, чтобы прерывание организовывалось каждую секунду) , помимо подгонки тех же параметров в окне Simulator-Interrupts?
|
|
|
|
|
Apr 9 2006, 14:53
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(proga @ Apr 9 2006, 19:41)  [1. При попытке просмотра в окне Watch информации о символах SEC,MIN,HR выводится надпись: Error: Unknown or ambiguous symbol. Почему так происходит? Потому что это регистровые переменные. См. объявление в RTC11x TA.s43 Код ; RTC variables #define SEC R13 #define MIN R14 #define HR R15 И смотреть их нужно View->Register Цитата(proga @ Apr 9 2006, 19:41)  2. Симуляция прерывания организуется в окне Simulator-Interrupts. Однако в этом случае приходится указывать значения таких параметров, как First Activation, Repeat interval, Hold time,Probability,Variance.Отсюда возникает вопрос: есть ли способ симулировать прерывание так , как это указанно в исходном тексте программы (т.е. применительно к вашему проекту, чтобы прерывание организовывалось каждую секунду) , помимо подгонки тех же параметров в окне Simulator-Interrupts? А зачем вам такая точная симуляция? Симуляция нужна лишь для проверки корректности работы алгоритма программы. Если нужно отлаживать в реальном времени, то берите тогда реальное "железо".
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|