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

 
 
> как сделать, чтоб асм не ругался
Gemm
сообщение Aug 26 2008, 08:58
Сообщение #1


Участник
*

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283



Начал поднимать data cache-MMU в железке на базе SAM9263. Компилер - IAR 5.1. Нашел на атмеле примерный проектик с драйстоун тестом, где кеши активно используются, но немножко не под мой компилятор smile.gif . И вот такая конструкция не компилится по причине того, что в асмовской инструкции я не могу использовать свою переменную ctl. Хотя это неправильно, она же регистровая...

Не хотелось бы ломать красивый код, а настроить свой асм, чтоб он понимал такой синтаксис.

И еще вопрос, если кто занимался - у at91rm9200 и at91sam9263 принципиально чем-то отличается работа с MMU и дата кешем?

__inline unsigned int AT91F_ARM_ReadControl()
{
register unsigned int ctl;
__asm("MRC p15, 0, ctl, c1, c0, 0");
return ctl;
}


Спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
Rst7
сообщение Aug 26 2008, 09:08
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Есть специальная функция в IAR'е
Цитата
__MRC
Syntax:
unsigned long __MRC(__ul coproc, __ul opcode_1, __ul CRn, __ul
CRm, __ul opcode_2);
Parameters:
coproc The coprocessor number 0..15.
opcode_1 Coprocessor-specific operation code.
src The value to be written to the coprocessor.
CRn The coprocessor register to write to.
CRm Additional coprocessor register; set to zero if not used.
opcode_2 Additional coprocessor-specific operation code; set to zero if not used.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 26 2008, 09:14
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Gemm @ Aug 26 2008, 12:58) *
Не хотелось бы ломать красивый код, а настроить свой асм, чтоб он понимал такой синтаксис.

Чем пользоваться сомнительными примерами, написали бы на asm свой startup с поддержкой MMU, запуском SDRAM, PLL и т.п. Дело примерно на полдня работы.

Цитата(Gemm @ Aug 26 2008, 12:58) *
И еще вопрос, если кто занимался - у at91rm9200 и at91sam9263 принципиально чем-то отличается работа с MMU и дата кешем?

Принципиально не отличается. Есть некоторые отличия в битах CP15.
Go to the top of the page
 
+Quote Post
Gemm
сообщение Aug 26 2008, 09:26
Сообщение #4


Участник
*

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283



Цитата(Rst7 @ Aug 26 2008, 13:08) *
Есть специальная функция в IAR'е


А под вышеописанный мной код нельзя адаптировать асм? Не хочу ломать либу.

Цитата(aaarrr @ Aug 26 2008, 13:14) *
Чем пользоваться сомнительными примерами, написали бы на asm свой startup с поддержкой MMU, запуском SDRAM, PLL и т.п. Дело примерно на полдня работы.


У меня есть свой csturtup с поддержкой всего этого, кроме MMU. Никогда с ним не работал. Поэтому посчитал, что наиболее быстрое решение - воспользоваться примером. Возможно, ошибаюсь.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 26 2008, 09:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Gemm @ Aug 26 2008, 13:26) *
А под вышеописанный мной код нельзя адаптировать асм? Не хочу ломать либу.

Компилятор Вам сломать не жалко, а "либу" жалеете? 07.gif

Цитата(Gemm @ Aug 26 2008, 13:26) *
У меня есть свой csturtup с поддержкой всего этого, кроме MMU. Никогда с ним не работал. Поэтому посчитал, что наиболее быстрое решение - воспользоваться примером. Возможно, ошибаюсь.


Ну, тогда добавьте поддержку MMU:
Код
; ***************************************************************************
; * Cache and MMU Configuration

    [ {TRUE}
        mrc        p15, 0, r0, c1, c0, 0    ; read CP15 register 1 into r0
        bic        r0, r0, #0x01            ; clear MMU enable
        bic        r0, r0, #(0x01 << 0x0c)    ; disable I Cache
        bic        r0, r0, #(0x01 << 0x02)    ; disable D Cache
        mcr        p15, 0, r0, c1, c0, 0    ; write value back

        mov        r0, #0x00
        mcr        p15, 0, r0, c7, c7, 0    ; invalidate caches
        mcr        p15, 0, r0, c8, c7, 0    ; invalidate TLBs


        ldr        r0, =ttb_first_level    ; set start of Translation Table base (16k Boundary)
        mcr        p15, 0x00, r0, c2, c0, 0x00; write to CP15 register 2
;
; Create translation table for flat mapping
; Top 12 bits of VA is pointer into table
; Create 4096 entries from 000xxxxx to fffxxxxx
;
        mov        r1, #0x00                ; loop counter
        ldr        r2, =2_110111110010        ; set access permissions (AP) for full access SVC/USR (11:10)
                                        ; set for domain 15 (8:5)
                                        ; must be 1 (4)
                                        ; set non cachable non bufferable (CB) (3:2)
                                        ; set for 1Mb section (1:0)
init_ttb0
        orr        r3, r2, r1, lsl #0x14
        ldr        r4, =sections
init_ttb1
        ldr        r5, [r4], #0x04
        tst        r5, #0x01
        bne        init_ttb2
        cmp        r1, r5, lsr #0x14
        addlo    r4, r4, #0x08
        blo        init_ttb1
        ldr        r5, [r4], #0x04
        cmp        r1, r5, lsr #0x14
        addhs    r4, r4, #0x04
        bhs        init_ttb1
        ldr        r5, [r4]
        orr        r3, r3, r5
init_ttb2
        str        r3, [r0, r1, lsl #0x02]
        add        r1, r1, #0x01
        cmp        r1, #0x1000
        blo        init_ttb0
;
; Init domains
;
        mov        r0, #(2_01 << 0x1e)        ; must define behaviour for domain 15 (31:30), set client
        mcr        p15, 0x00, r0, c3, c0, 0x00; write to CP15 register 3
;
; Set global core configurations
;
        mrc        p15, 0x00, r0, c1, c0, 0x00; read CP15 register 1 into r0

        orr        r0, r0, #(0x01 << 0x0c)    ; enable I Cache
        orr        r0, r0, #(0x01 << 0x02)    ; enable D Cache
        orr        r0, r0, #0x01            ; enable MMU
;
; Additional configuration options      
;        
;        orr        r0, r0, #(0x01 << 0x0e)    ; enable Round Robin cache replacement
;        orr        r0, r0, #(0x01 << 0x0d)    ; enable Hi Vectors
        orr        r0, r0, #(0x01 << 0x01)    ; enable data address alignment checking

        mcr        p15, 0x00, r0, c1, c0, 0x00; write cp15 register 1
    ]

; ***************************************************************************
; *

sections
        DCD        0x00000000    ; SRAM
        DCD        0x00100000
        DCD        2_1100        ; wb, buffered

        DCD        0x20000000    ; SDRAM
        DCD        0x22000000
        DCD        2_1100        ; wb, buffered

        DCD        0x00000001    ; END
Go to the top of the page
 
+Quote Post
Gemm
сообщение Aug 26 2008, 09:39
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283



Цитата(aaarrr @ Aug 26 2008, 13:31) *
Компилятор Вам сломать не жалко, а "либу" жалеете? 07.gif
Ну, тогда добавьте поддержку MMU:


Не, не ломать - настроить штатным способом. Если нельзя - то нельзя, хрен с ним... Просто у нас тут по историческим причинам некоторые люди компиляют ИАРом, некоторые - ГЦЦ. Иногда хочется, чтоб код был универсальный...

За асмовский код огромное спасибо, постараюсь к вечеру досканально разобраться и внедрить...
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 26 2008, 10:43
Сообщение #7


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Не вижу проблем в обеспечении универсальности:
Код
#ifdef __IAR_SYSTEMS_ICC__
__arm unsigned int AT91F_ARM_ReadControl(void)
{
return __MRC(15,0,ctl,1,0,0);
}
#else
__inline unsigned int AT91F_ARM_ReadControl()
{
register unsigned int ctl;
__asm("MRC p15, 0, ctl, c1, c0, 0");
return ctl;
}
#endif


Только вот в даташит гляньте, что надо вместо ctl поставить (численное значение, я имею в виду)


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Gemm
сообщение Aug 26 2008, 11:35
Сообщение #8


Участник
*

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283



Цитата(Rst7 @ Aug 26 2008, 14:43) *
Не вижу проблем в обеспечении универсальности:
Код
#ifdef __IAR_SYSTEMS_ICC__
__arm unsigned int AT91F_ARM_ReadControl(void)
{
return __MRC(15,0,ctl,1,0,0);
}
#else
__inline unsigned int AT91F_ARM_ReadControl()
{
register unsigned int ctl;
__asm("MRC p15, 0, ctl, c1, c0, 0");
return ctl;
}
#endif


Только вот в даташит гляньте, что надо вместо ctl поставить (численное значение, я имею в виду)


Строка __asm("MRC p15, 0, ctl, c1, c0, 0"); не прокатывает. Этой инструкции нужно не переменную передать, а явно указать регистр. Вот так получается: __asm("MRC p15, 0, r0, c1, c0, 0"); Я собственно и спрашиваю, как сделать, чтоб заработало с переменной.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Aug 26 2008, 11:45
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(Rst7 @ Aug 26 2008, 13:08) *
Есть специальная функция в IAR'е

Странная какая-то функция: MRC - это чтение регистра сопроцессора, а здесь
Цитата
CRn The coprocessor register to write to.
Go to the top of the page
 
+Quote Post
Alex03
сообщение Aug 26 2008, 11:53
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 359
Регистрация: 9-12-05
Пользователь №: 12 034



Если вы знаете соглашение о вызовах, например что результат unsigned long из функции передаётся в r0, то и пользуйте r0. Ну а чтобы не было мата про возвращаемое значение и чтобы компилятор не генерил пролог/эпилог функцию можно объявить как naked. Как это делается в ИАРе я не знаю, ибо не пользую (может __raw), в GCC всё просто, в том числе входные/выходные параметры в АСМ-блок. smile.gif
Go to the top of the page
 
+Quote Post
Rst7
сообщение Aug 26 2008, 12:15
Сообщение #11


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Я собственно и спрашиваю, как сделать, чтоб заработало с переменной.


Дык для иара я Вам написал. Только ошибся малость. Надо
Код
return __MRC(15,0,1,0,0);


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Gemm
сообщение Aug 26 2008, 12:30
Сообщение #12


Участник
*

Группа: Свой
Сообщений: 61
Регистрация: 2-08-05
Из: Коломна
Пользователь №: 7 283



Цитата(Rst7 @ Aug 26 2008, 16:15) *
Дык для иара я Вам написал. Только ошибся малость. Надо
Код
return __MRC(15,0,1,0,0);

Аааа, все понял. Спасибо. Не заметил, что иаровская функция - на асме переклинило...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:31
Рейтинг@Mail.ru


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