реклама на сайте
подробности

 
 
> программа на ассемблере
dimka76
сообщение Jun 4 2008, 11:23
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Добрового времени суток :-)

Хочу написать на ассемблере программку и что-бы она размещалась во внутренней SRAM.
Достаточно ли для этого в начале программы прописать .ORG <адресс SRAM> (естественно после всего того что нужно прописать в стартапе) ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
dimka76
сообщение Jun 4 2008, 12:22
Сообщение #2


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



а разве на Си не достаточно перед именем функции написать __famfunc ?
Директива .ORG как раз и говорит линкеру куда размещать следующий за ней код или я не прав?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 5 2008, 10:13
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dimka76 @ Jun 4 2008, 15:22) *
а разве на Си не достаточно перед именем функции написать __famfunc ?
Директива .ORG как раз и говорит линкеру куда размещать следующий за ней код или я не прав?
Рассуждать бессмысленно не зная ни типа процессора ни используемого компилятора/ассемблера/линкера. Обычно директива .ORG задает смещение в текущей секции (а не абсолютный адрес). Адреса начала секций указываются линкеру в его скрипте. __ramfunc, если речь идет об IAR для ARM, указывает линковать код в секцию CODE_I. Скрипт линкера заставляет размещать содержимое секции CODE_I в секцию CODE_ID. Копирование из CODE_ID в CODE_I производит startup-код.

Давайте вы для начала признаетесь, о каком компиляторе/ассемблере идет речь и для какого процессора, а еще уточните, как ваша ассемблерная программа будет попадать в ОЗУ.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 5 2008, 12:58
Сообщение #4


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(Сергей Борщ @ Jun 5 2008, 13:13) *
Давайте вы для начала признаетесь, о каком компиляторе/ассемблере идет речь и для какого процессора, а еще уточните, как ваша ассемблерная программа будет попадать в ОЗУ.


компилятор IAR C/C++ Compiler for ARM 4.41A Kickstart (4.41.1.301)

процессор LPC2103

При функции написании на Си с указанием __ramfunc функция размещается в ОЗУ, а попадает туда при вкл. питания автоматически копируясь из FLASH. По крайней мере я так понял разбираясь с этим типом контроллеров. Кстати, если писать такие фукции на Си( __ramfunc) -> зашиваю контроллер -> работает (дергает ножкой) -> выключаю питание -> включаю питание -> опять работает -> значит образ функции исполняемой из ОЗУ изначально хранится во FLASH и копируется в ОЗУ при вкл. питания.

Вот я хочу получить такую же функцию на ассемблере, используя IAR.

По поводу директивы .ORG - она задает абсолютный адрес, проверено на практике. И директивы ассемблера, как правило, одинаковы для всех ассемблеров и контроллеров/процессоров. Вот.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 5 2008, 13:38
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(dimka76 @ Jun 5 2008, 15:58) *
Кстати, если писать такие фукции на Си( __ramfunc) -> зашиваю контроллер -> работает (дергает ножкой) -> выключаю питание -> включаю питание -> опять работает -> значит образ функции исполняемой из ОЗУ изначально хранится во FLASH и копируется в ОЗУ при вкл. питания.
Да. Но это копирование происходит не "само" каким-то магическим образом, а это делает процедура cstartup. Вы можете убедиться в этом, пройдя программу в симуляторе по шагам от вектора сброса до main().
Цитата(dimka76 @ Jun 5 2008, 15:58) *
Вот я хочу получить такую же функцию на ассемблере, используя IAR.
Как отдельную законченную программу или как одну из функций С-программы? Если последнее, то напишите в начале вашей функции
Код
    RSEG CODE_I : CODE
Если как отдельную программу - то вам придется делать копирование самостоятельно.Сложного там ничего нет, обычный цикл, для получения адресов используйте операторы SFB, SFE, в линкерном скрипте - опцию -Q (посмотрите пример в папках компилятора).
Цитата(dimka76 @ Jun 5 2008, 15:58) *
По поводу директивы .ORG - она задает абсолютный адрес, проверено на практике. И директивы ассемблера, как правило, одинаковы для всех ассемблеров и контроллеров/процессоров. Вот.
Вот? Во-первых, "отучаемся говорить за всех...".
Во-вторых, в какой адрес, по-вашему, попадут эти переменные:
Код
        NAME    PWM_Data
        RSEG    PWM_DATA : DATA(0)
        ORG    0

FREQ_0            DS    1
FREQ_1            DS    1
Bitrate            DS    1
/* FFSK */
SinStep            DS    1
Quadrant        DS    1
BitPhase        DS    2
    ORG    SinStep
/* GFSK,GMSK */
Curve            DS    1
Shifter            DS    1
        ENDMOD
Я утверждаю, что в начало сегмента PWM_DATA. А абсолютный адрес присвоит линкер в процессе размещения секции (проверено на практике smile.gif ).

В-третьих: По умолчанию ассемблерный файл ассемблируется в абсолютную секцию (см. директиву ASEG). Поэтому если вы не использовали директив переключения секций (RSEG, ASEG, COMMON, STACK), то ваш код попадал в абсолютную секцию, которая начинается с адреса 0 и поэтому результат вашей ORG совпадал с абсолютным адресом.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Jun 6 2008, 04:16
Сообщение #6


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Цитата(Сергей Борщ @ Jun 5 2008, 16:38) *



Спасибо .
Код
    RSEG CODE_I : CODE
помогло :-)

У меня еще один вопросик возник.

пишу так

с Си файле
Код
extern void foo(void);

void main(void)
{
   foo();
   ...
   ....
}


В ассемблерном файле

Код
        MODULE    ?foo         
        PUBLIC  foo        
            
         RSEG CODE_I : CODE      
           CODE32

Table1:     //всего 255 значений
      
       DC32                   0        //0
       DC32        2        //1
       DC32        6        //2
...
...
       DC32        1025        //255

Table2:     //всего 255 значений
      
       DC32                   0        //0
       DC32        20        //1
       DC32        60        //2
...
...
       DC32        4025        //255


foo                  

      mov   R4,#Table1  
      mov   R8,#Table2

       mov   PC,LR

       ENDMOD  
      
      END


компиляция проходит успешно, а линкер выдает следующие ошибки

Код
Error[e18]: Range error, Number out of range
  Where $ = foo + 0x4  [0x40000804]
            in module "?foo" ,
            offset 0x804 in segment part 0, segment CODE_I
  What: foo [0x40000000]
  Allowed range: 0x0 - 0xFF
  Operand: foo [0x40000000]
           in module ?foo ,
           Offset 0x0 in segment part 0, segment CODE_I


я так подозреваю, что это связано со вторым операндом в строках
Код
      mov   R4,#Table1  
      mov   R8,#Table2


Объясните пожалуйста в чем дело?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 07:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016