Приветствую всех, коллеги!
Взялся таки осваивать бесплатные инструменты. Переношу прогу с IAR под WinAVR. Есть у меня несколько функций, которые от заказчика к заказчику (от таргета к таргету) меняются местами. Сделано так потому, что моя часть кода находится в адресах загрузчика и закрыта от чтения заказчиком. А он свою прогу заливает в остальную память и вызывает мои функции по одному ему известным адресам. А я нужную мне информацию беру вызывая их функции по известным мне и назначенных им адресам. Это чтобы заказчики друг у друга устройства не воровали. Ну вот захотели они так. Итак у меня есть несколько функции, и есть файл в котором собраны все "заказчикозависимые" константы: customer1.h: #define _POLY_ 0x8408 #define _CRC_INIT_ 0x0000 // User Routines remap #define _INC_PTR_ 0x17E4 #define _SHIFT_MASK_ 0x17EE #define _BITRATE_ 0x17F2 #define _FREQ_0_ 0x17F6 #define _FREQ_1_ 0x17FA // Driver Routines remap #define _SYNTH_INIT_ 0x1832 #define _TX_PUTCHAR_ 0x1834 #define _GET_SERIAL_ 0x1836
теперь мне надо функцию LDI R16,0 RET разместить по абсолютному адресу _FREQ_1_. Я пробую .section .text .align 2 .org _FREQ_1_ LDI R16,0 RET он почему-то _FREQ_1_ отсчитывает не от начала секции .text, а от первого свободного байта в этой секции, т.е. .org работает как .skip, да еще к тому же без .align вставляет nop перед моим кодом. В общем, как мне правильно описать компилятору то, что я хочу. И второй аналогичный вопрос будет - как его заставить кое-какие переменные разместить в секции .bss по конкретному адресу?
С уважением, Сергей Борщ