Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Глюк компилятора или это я чего-то не понимаю?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Ahha
Доброго времени суток всем.
Недавно столкнулся со странным поведением IAR for AVR 4.21A. Была написана смешанная С/АСМ программа для меги8. И тут столкнулся со странным поведением компилятора. После вот такого объявления переменных в Сишной части кода:

volatile int *TaskPointer=&TaskBuf[0];
void (*StartPoint)(void);

компилятор, обработав мой ассемблерный код:

lds XL , TaskPointer // мой текст в АСМ функции
lds XH , (TaskPointer+1) // мой текст в АСМ функции

после дизассемблирования выдал следующее (не работает):

00007E 91A0 0060 LDS R26,TaskPointer // это выдал дизассемблер
000082 91B0 0061 LDS R27,StartPoint // это выдал дизассемблер

То есть получилось, что или компилятор почему-то наложил 2-ух байтные переменные друг на друга одним байтом, или же указатель на переменную типа int в С для мега8 - это однобайтная переменная? Просто тот же текст прекрасно работает при компиляции под мега164Р.
После длительного поиска этой ошибки и ломания головы "как же такое могло случится" выдумал вот такой вариант этого куска программы, который решил проблему:

Сишное объявление переменных:

volatile int TaskPointer=(int)&TaskBuf[0];
void (*StartPoint)(void);

мой ассемблерный код:

lds XL , TaskPointer // мой текст в АСМ функции
lds XH , (TaskPointer+1) // мой текст в АСМ функции

результат дизассемблирования (работает нормально) :

00007E 91A0 0060 LDS R26,TaskPointer
000082 91B0 0061 LDS R27,0x61

Вобщем проблема уже решена, но хотелось бы разобратся в этом вопросе основательно, чтоб не наступать позже на теже грабли sad.gif
IgorKossak
Модель памяти для мега8 случайно не tiny выбрали?
Такая модель памяти подразумевает однобайтовые указатели.
Выберите модель small и, как говорится, будет Вам счастье.
rezident
Может я не совсем постиг сути вашего замысла, либо у вас банальная ошибка в тексте.
Код
volatile int *TaskPointer=&TaskBuf[0];

Код
volatile int TaskPointer=(int)&TaskBuf[0];

В первом случае TaskPointer это указатель типа int, во втором случае это переменная типа int.
singlskv
Я тоже не до конца постиг суть Вашего замысла, а компилятор в обоих случаях
сделал ровно то что Вы у него попросили
Цитата(Ahha @ Jun 16 2007, 12:03) *
1.
volatile int *TaskPointer=&TaskBuf[0]; //указатель на int
void (*StartPoint)(void);

компилятор, обработав мой ассемблерный код:
lds XL , TaskPointer // = low(TaskPointer)
lds XH , (TaskPointer+1) // = low(TaskPointer+sizeof(int)) ; случайно совпало с StartPoint

2.
volatile int TaskPointer=(int)&TaskBuf[0]; // int
void (*StartPoint)(void);

мой ассемблерный код:

lds XL , TaskPointer // =low(TaskPointer)
lds XH , (TaskPointer+1) // =low(TaskPointer+1)

результат дизассемблирования (работает нормально) :

00007E 91A0 0060 LDS R26,TaskPointer
000082 91B0 0061 LDS R27,0x61 // А Вы действительно хотели получить 0x61 ???
Ahha
Уважаемый IgorKossak верно понял суть моей проблемы. Все дело действительно заключалось в модели памяти (от нее зависит размер указателя). При переходе на мегу8 была выбрана модель tiny где указатель имеет величину в 1 байт, а писалась программа изначально для мега164Р с моделью памяти small где указатель имеет величину в 2 байта. Это и вызвало путаницу при работе с указателями в ассемблерной функции.
2 singlskv и rezident: мой замысел действительно очень запутан, а потому прошу прощения, что не смог толково описать его суть. Причина такой запутанности в том, что основная программа написана на С, а одна функция реализована на ассемблере. Но все равно всем спасибо за помощь начинающему, теперь суть проблемы ясна.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.