26.02.2010, 21:30
|
|
Частый гость
Регистрация: 30.08.2008
Сообщений: 38
Сказал спасибо: 43
Сказали Спасибо 1 раз в 1 сообщении
|
Re: IAR Embedded Workbench
Сообщение от kison
|
Учитывая что d-›sens.gas = GET_GAS_VALVE_STATE(); это часть исходника SECU-3
http://secu-3.narod.ru/
Откуда пример то взяли?
|
Да разбираю ,хочу понять алгоритм. И заодно освоить ИАР
|
|
|
|
26.02.2010, 21:57
|
|
Частый гость
Регистрация: 30.08.2008
Сообщений: 38
Сказал спасибо: 43
Сказали Спасибо 1 раз в 1 сообщении
|
Re: IAR Embedded Workbench
интегральные величины
//описывает все входы системы - их производные и
typedef struct
{
unsigned int map; //давление во впускном коллекторе (усредненное)
unsigned int voltage; //напряжение бортовой сети (усредненное)
signed int temperat; //температура охлаждающей жидкости (усредненная)
unsigned int frequen; //частота вращения коленвала (усредненная)
unsigned int inst_frq; //мгновенная частота вращения
unsigned char carb; //состояние концевика карбюратора
unsigned char gas; //состояние газового клапана
unsigned int frequen4; //частота усредненная всего по 4-м выборкам
//сырые значения датчиков (дискреты АЦП с компенсированными погрешностями)
signed int map_raw;
signed int voltage_raw;
signed int temperat_raw;
}sensors;
Привёл ссылку на структуру
Тут пишут "sensors;" a выражение sens.gas
C я занимаюсь недавно работал на АСМЕ и Бейсике
нашёл интересную с моей кочки зрения прграмму
SECU_3 скачал ИАР для этого т.е хочу понять что к чему
|
|
|
|
26.02.2010, 23:07
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
Нет это только объявление типа.
ниже будет что-нибудь типа
sensors sens;
То есть объявление переменной sens типа sensors;
Далее будет что-нибудь с объявлением "d".
|
|
|
Сказали "Спасибо" SasaVitebsk
|
|
|
27.02.2010, 02:00
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: IAR Embedded Workbench
Ура до меня дошло ![Очень счастлив](images/smilies/icon_grin.gif) ,даже теперь по-другому стал мыслить.
Для таких как я,примеры загрузки глобальных переменных из Асма:
unsigned char:
Код:
|
//программа на Си
unsigned char q = 0x01;
--------------------------------
//Асм
PUBLIC DispStart
EXTERN q
RSEG CODE
DispStart:
//загружаем переменную q
lds r16,q
//загружаем адрес переменной
ldi r16,low(q)
ldi r17,high(q)
ret
END |
long int:
Код:
|
//программа на Си
long int q = 0x44332211;
--------------------------------
//Асм
PUBLIC DispStart
EXTERN q
RSEG CODE
DispStart:
//загружаем переменную q
lds r16,q
lds r17,q+1
lds r18,q+2
lds r19,q+3
//или
ldi r30,low(q)
ldi r31,high(q)
ld r16,Z
ldd r17,Z+1
ldd r18,Z+2
ldd r19,Z+3
//загружаем адрес переменной
ldi r16,low(q)
ldi r17,high(q)
ret
END |
и мой случай загрузка указателя на массив во flesh памяти:
Код:
|
//программа на Си
typedef void(*TFuncPtr)(void);
__flash TFuncPtr FArray[2] = {&AdrRecFromPC,&AdrCRCRecFromPC};
--------------------------------
//Асм
PUBLIC DispStart
EXTERN FArray
RSEG CODE
DispStart:
//загружаем адрес переменной (FArray[0])
ldi r16,low(FArray)
ldi r17,high(FArray)
ret
END |
Спасибо за терпение и всем кто помогал.Вопросов больше нет.
Цель достигнута: загрузка через ldi адресов переменных.
А ответ был буквально перед носом, спасибо Вам SasaVitebsk, (там где пример со структурой),
но я почему-то в упор не увидел решения,неправильная постановка вопроса и задачи приводит
вот к таким долгим въезжаниям, постараюсь исправится,еще раз всем спасибо.
Последний раз редактировалось DrunyaRuma; 27.02.2010 в 02:30.
|
|
|
|
27.02.2010, 03:01
|
|
Гражданин KAZUS.RU
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
|
Re: IAR Embedded Workbench
![Шокирован](images/smilies/icon_eek.gif)
Я думал это очевидно.
Поэтому и показал работу со структурой. С передачей указателя на структуру и показал как можно прямой загрузкой работать с разными полями, а также, что очень удобно, когда инициализируешь регистровую пару на начало структуры, и с помощью LDD обращаешься непосредственно к разным полям структуры. Причём по именам.
Кстати точно также можно обращаться и к флагам. И работать с ними побитно.
Причём структура выбрана не случайно. Дело в том, что компилятор гарантирует порядок размещения данных внутри структуры.
Это важно! При работе с ARM7, я убедился что объявление, например
uint8_t a[15],b[3],c[10]; не гарантирует, что данные в памяти пойдут подряд. Компилятор может их тусануть. Из-за выравнивания.
А вообще ваша задача в общем-то решается что-то типа
Код:
|
struct process
{
uint8_t fReady;
void __flash * Name;
};
#define NPROC 2
process tekProc[NPROC] =
{
{TRUE,&Func1},
{FALSE,&Func2}
}
int main(void)
{
uint8_t i;
for(i=0;i‹NPROC;i++)
{
if(tekProc[i].fReady)
{
tekProc[i].fReady = FALSE;
tekProc[i].Name();
}
} |
|
|
|
|
27.02.2010, 05:00
|
|
Временная регистрация
Регистрация: 13.02.2008
Сообщений: 60
Сказал спасибо: 10
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: IAR Embedded Workbench
Спасибо за примерчик, обязательно отработаю его. Зря я Вас сразу не
послушал, все-таки идея хранить адреса переменных в статическом виде
до ужаса бредовая, ведь функций может быть очень много,памяти сожрет прилично,а "глобальных" задач несколько.Поэтому мой тренировочный проект несколько изменился, в связи с чем у меня родилась еще одна бредовая идея,но об этом завтра (может она и отпадет, а то уже поздно голова совсем не варит,а остановится тяжело).
Я полностью убедился, что у меня неправильное понимание языка Си
с точки зрения методов программирования,спасибо что ставите на путь
истинный.
P.S.
Мне ужасно стыдно за то, что я влез с объяснениями про структуры со своим извращенным понятием о ней. Керниган и Ричи помогли все понять.
|
|
|
|
30.03.2010, 22:29
|
|
Прохожий
Регистрация: 17.02.2010
Сообщений: 3
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR Embedded Workbench
Добрый вечер, хотелось бы попросить у вас помощи.
1. как настроить IAR чтобы его hex файл можно было подключить в Proteus 7.6 SP0
данные настройки не подошли, Протеус выдает ошибку.
и в чем может быть дело, IAR через раз выдает ошибка :
User erorr:Illegal opcode found on adress 0x0
|
|
|
|
31.03.2010, 00:31
|
|
Временная регистрация
Регистрация: 13.03.2006
Сообщений: 56
Сказал спасибо: 12
Сказали Спасибо 22 раз(а) в 9 сообщении(ях)
|
Re: IAR Embedded Workbench
скрин приложил,но если с hex то в release утановить intel standart
|
|
|
|
31.03.2010, 01:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
|
Re: IAR Embedded Workbench
Установите в output format - dwarf-2 ( ну или похожее типа dwarf2, я уже не помню как формат точно у IAR называется) Это вместо ubrof 8
Можно конечно и по hex отлаживаться, но это безумно неудобно.
|
|
|
|
01.04.2010, 02:16
|
|
Прохожий
Регистрация: 17.02.2010
Сообщений: 3
Сказал спасибо: 2
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: IAR Embedded Workbench
Сообщение от Polite
|
User erorr:Illegal opcode found on adress 0x0
|
в чем может быть проблема?
сама среда выдает в начале процесса дебага.
компилит без ошибок
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подниму тему WinAVR vs IAR
|
oleg110592 |
Микроконтроллеры, АЦП, память и т.д |
5 |
24.10.2015 14:06 |
Часовой пояс GMT +4, время: 22:36.
|
|