Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

ИАР тоже в некоторых случаях требует сдвигов адресов. Правда,(+)

Отправлено Quasy 14 марта 2008 г. 10:29
В ответ на: AVR Assembler и AVR Assembler2 ведут счетчик слов во Flash в 16-битных словах, а команды обращения ко Flash требуют, чтобы содержимое индексного регистра (Z) в командах обращения к Flash (lpm/spm), имело размерность в байтах. Эта нелепость тянется с первой версии AVRASM и до сих пор - другие ассемблеры (тот же IAR) прекрасно умеют адресуовать и RAM, и Flash в байтах и тем самым не компостировать людям моск идиотскими "*2" отправлено =AVR= 13 марта 2008 г. 21:41


в другую сторону :).
Клгда из Си по указателю надо вызывать функцию, то указателю просто
присваивают имя этой функции, и разыменовывают указатель, вызывая ее.
Тут все просто, и что об этом говорить...
А вот если хотим обратиться к Сишному flash-массиву, где лежат коды
ассемблерных подпрограмм (например, когда надо запутать кого-либо -
пусть разбирается), то обратиться к этому flash-массиву как к
вызываемой функции можно тоже через указатель, но придется сдвигать
его вправо.
///////////////////////////////////////
const unsigned int __farflash area_fun[] =
{ // Массив АСМ-кодов функции в виде табдицы uint.
0x0000, //0 fun1: nop
0x0000, //1 nop
0x9508, //2 ret
0x0000, //3 fun2: nop
0x0000, //4 nop
0x9508, //5 ret
0x0000, //6 fun3: nop
0x0000, //7 nop
0x9508, //8 ret
0x9508, //9 fun5: ret
};
const unsigned char __farflash Table_Offset[] =
{
// Массив смещений для функций в таблицк area_fun.
// Размер должен быть кратен 2^x
0, 3, 6, 9
};
__C_task main( void )
{
// Обращение к первой функции массива. Смещение у нее 0
((void (*)())(((unsigned int)((unsigned int *)(area_fun)) >> 1)))();


// Поочередное обращение ко всем функциям массива.
// Смещения адреса берется из таблицы смещений Table_Offset.
((void (*)())(((unsigned int)((unsigned int *)
(area_fun + Table_Offset[ 0 ])) >> 1)))();

((void (*)())(((unsigned int)((unsigned int *)
(area_fun + Table_Offset[ 1 ])) >> 1)))();

((void (*)())(((unsigned int)((unsigned int *)
(area_fun + Table_Offset[ 2 ])) >> 1)))();

((void (*)())(((unsigned int)((unsigned int *)
(area_fun + Table_Offset[ 3 ])) >> 1)))();
}
////////////////////////////////////


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
вычтите два из трёх, получится:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru