|
как сделать, чтоб асм не ругался |
|
|
|
Aug 26 2008, 08:58
|

Участник

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

|
Начал поднимать data cache-MMU в железке на базе SAM9263. Компилер - IAR 5.1. Нашел на атмеле примерный проектик с драйстоун тестом, где кеши активно используются, но немножко не под мой компилятор  . И вот такая конструкция не компилится по причине того, что в асмовской инструкции я не могу использовать свою переменную ctl. Хотя это неправильно, она же регистровая... Не хотелось бы ломать красивый код, а настроить свой асм, чтоб он понимал такой синтаксис. И еще вопрос, если кто занимался - у at91rm9200 и at91sam9263 принципиально чем-то отличается работа с MMU и дата кешем? __inline unsigned int AT91F_ARM_ReadControl() { register unsigned int ctl; __asm("MRC p15, 0, ctl, c1, c0, 0"); return ctl; } Спасибо.
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Aug 26 2008, 09:14
|
Гуру
     
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Aug 26 2008, 09:26
|

Участник

Группа: Свой
Сообщений: 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. Никогда с ним не работал. Поэтому посчитал, что наиболее быстрое решение - воспользоваться примером. Возможно, ошибаюсь.
|
|
|
|
|
Aug 26 2008, 09:31
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Gemm @ Aug 26 2008, 13:26)  А под вышеописанный мной код нельзя адаптировать асм? Не хочу ломать либу. Компилятор Вам сломать не жалко, а "либу" жалеете? Цитата(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
|
|
|
|
|
Aug 26 2008, 09:39
|

Участник

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

|
Цитата(aaarrr @ Aug 26 2008, 13:31)  Компилятор Вам сломать не жалко, а "либу" жалеете? Ну, тогда добавьте поддержку MMU: Не, не ломать - настроить штатным способом. Если нельзя - то нельзя, хрен с ним... Просто у нас тут по историческим причинам некоторые люди компиляют ИАРом, некоторые - ГЦЦ. Иногда хочется, чтоб код был универсальный... За асмовский код огромное спасибо, постараюсь к вечеру досканально разобраться и внедрить...
|
|
|
|
|
Aug 26 2008, 10:43
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 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 поставить (численное значение, я имею в виду)
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 26 2008, 11:35
|

Участник

Группа: Свой
Сообщений: 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"); Я собственно и спрашиваю, как сделать, чтоб заработало с переменной.
|
|
|
|
|
Aug 26 2008, 12:15
|

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

|
Цитата Я собственно и спрашиваю, как сделать, чтоб заработало с переменной. Дык для иара я Вам написал. Только ошибся малость. Надо Код return __MRC(15,0,1,0,0);
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
Aug 26 2008, 12:30
|

Участник

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

|
Цитата(Rst7 @ Aug 26 2008, 16:15)  Дык для иара я Вам написал. Только ошибся малость. Надо Код return __MRC(15,0,1,0,0); Аааа, все понял. Спасибо. Не заметил, что иаровская функция - на асме переклинило...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|