Перейти к содержанию
    

Но мне не понятно как мы её можем использовать попав уже в обработчик SWI? Это что получается нужно читать команду с которой мы перешли из памяти или как? Поясните пожалуйста.

Да, именно так. Вот, например, обработчик от ARM:

;;; Copyright ARM Ltd 1998. All rights reserved.

   PRESERVE8
   AREA SWI_Area, CODE, READONLY

   EXPORT SWI_Handler
   IMPORT C_SWI_Handler

T_bit EQU 0x20

SWI_Handler

   STMFD   sp!, {r0-r3, r12, lr}  ; Store registers
   MOV     r1, sp                 ; Set pointer to parameters
   MRS     r0, spsr               ; Get spsr
   STMFD   sp!, {r0, r3}          ; Store spsr onto stack and another
                                  ; register to maintain 8-byte-aligned stack
   TST     r0, #T_bit             ; Occurred in Thumb state?
   LDRNEH  r0, [lr,#-2]           ; Yes: Load halfword and...
   BICNE   r0, r0, #0xFF00        ; ...extract comment field
   LDREQ   r0, [lr,#-4]           ; No: Load word and...
   BICEQ   r0, r0, #0xFF000000    ; ...extract comment field

       ; r0 now contains SWI number
       ; r1 now contains pointer to stacked registers

   BL      C_SWI_Handler          ; Call main part of handler
   LDMFD   sp!, {r0, r3}          ; Get spsr from stack
   MSR     spsr_cf, r0            ; Restore spsr
   LDMFD   sp!, {r0-r3, r12, pc}^ ; Restore registers and return

   END

 

Правильно ли я трактовал? Вы бы не могли привести общие рекомендации когда нужгно использовать ARM а когда Thumb?

Нужно еще прибавить урезанность работы с immediate, методов адресации и т.п.

Я бы сказал, что всегда нужно работать в ARM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы сказал, что всегда нужно работать в ARM.
Кроме процессоров ADuC, которые имеют 16-битную неспешную флеш и в них Thumb ощутимо быстрее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я бы сказал, что всегда нужно работать в ARM.

Наверное за исключение когда обьемы FLASH ограничены. Мне вот дали пример большого проекта под АРМ, я ещё не смотрел что он делает, но если собрать его под Thumb то получается 70155, а под ARM 116639, разница в 46К что более чем в полтора раза больше.

 

В описании указано, что ARM поддерживает оба порядка следования байт little-endian и big-endian. Сказано что по-умолчанию используется little-endian, но никак не могу найти где описано как эту смену произвести? В компиляторе нашел флаг смены порядка, но как это делается командами процессора?

 

 

кстати читал что такие большие команды как "STMFD sp!, {r0-r3, r12, lr}"регулярно использоваться не рекомендуется так как значительно повышает латентность прерываний. Вообще читал, что высокая латентность большой из недостатков данной архитектуры, так ли это? А то что-то не верится :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное за исключение когда обьемы FLASH ограничены. Мне вот дали пример большого проекта под АРМ, я ещё не смотрел что он делает, но если собрать его под Thumb то получается 70155, а под ARM 116639, разница в 46К что более чем в полтора раза больше.

Это что-то жуткое написано (скорее чего-нибудь в стиле восьмибитовика)- разница у меня обычно крайне не велика - единицы процнентов, ну 10.

В описании указано, что ARM поддерживает оба порядка следования байт little-endian и big-endian. Сказано что по-умолчанию используется little-endian, но никак не могу найти где описано как эту смену произвести?

Как правило никак - ядро это одно, а реализация в железе, как правило не поддерживает такую возможность.

 

кстати...

А что Вы хотели заказав зараз пересылку кучи регистров?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Наверное за исключение когда обьемы FLASH ограничены. Мне вот дали пример большого проекта под АРМ, я ещё не смотрел что он делает, но если собрать его под Thumb то получается 70155, а под ARM 116639, разница в 46К что более чем в полтора раза больше.

Использование Thumb из-за ограниченного размера флеш все же крайний случай, ИМХО.

 

В описании указано, что ARM поддерживает оба порядка следования байт little-endian и big-endian. Сказано что по-умолчанию используется little-endian, но никак не могу найти где описано как эту смену произвести? В компиляторе нашел флаг смены порядка, но как это делается командами процессора?

Эндианизм задается аппаратно сигналом BIGEND ядра, поменять его программно нельзя.

 

кстати читал что такие большие команды как "STMFD sp!, {r0-r3, r12, lr}"регулярно использоваться не рекомендуется так как значительно повышает латентность прерываний. Вообще читал, что высокая латентность большой из недостатков данной архитектуры, так ли это? А то что-то не верится :)

Да, это так. Некоторые компиляторы имеют опцию принудительного разбиения LDM/STM.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это что-то жуткое написано (скорее чего-нибудь в стиле восьмибитовика)

Давно хотел спросить, а что означает фраза "написано в стиле восьмибитовика"???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Давно хотел спросить, а что означает фраза "написано в стиле восьмибитовика"???

Наверное, имеется в виду использование где ни попадя восьмибитных переменных вместо нативных 32-х битных.

Таки да, thumb в этом случае будет заметно компактнее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я понял лучше всего использовать uint32_t и тому подобное.

И это получается если я даже знаю что переменная хранит значение не больше 256, или вообще ноль/не_ноль, но все-равно лучше использовать 32-битную переменную? Ну и аналогично просто 16 битную переменную?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И это получается если я даже знаю что переменная хранит значение не больше 256, или вообще ноль/не_ноль, но все-равно лучше использовать 32-битную переменную? Ну и аналогично просто 16 битную переменную?

Если вам не нужна именно восьмибитная переменная, то да, нужно использовать 32-х битную. Иначе получите изрядный оверхед на постоянном приведении результата операций к восьми битам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

но все-равно лучше использовать 32-битную переменную?

Для портируемости правильнее что-то типа int_fast8_t, int_least8_t

 

P.S.

Вообще-то Ваши вопросы правильные, что редкость, то тем не менее на форуме они обсуждались МНОГОКРАТНО. Надо-бы ознакомиться с предшественниками :(, для начала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, именно так. Вот, например, обработчик от ARM:

Кстати Вы очень часто приводите стандартные примеры от ARM. Но я их что-то нигде найти не могу, подскажите от куда вы их выдираете?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...примеры от ARM

Все это добро, обычно с компиляторами идет, а от "ARM" это Keil, который давненько уже "ARM Company". Только особо не обольщайтесь, хоть и "Company", но исходники там больше "Студеческие".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2zltigo, А есть где-нибудь просторах интернета исходники какого-нибудь проекта написанного не-"студенчески"?

Хочу проанализировать для общеобразовательных целей.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2zltigo, А есть где-нибудь просторах интернета исходники какого-нибудь проекта написанного не-"студенчески"?

Цельного не встречал :). А так, приличные исходники встречаются. У "студенческих" тоже на самом деле тоже есть чему поучится - им цельности не хватает, но отдельные элементы и приемы, которым, видимо учили, весьма познавательны. Сшивки между ними ну буквально "белыми нитками" и самодельные куски страшные встречаются :(.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Все это добро, обычно с компиляторами идет, а от "ARM" это Keil, который давненько уже "ARM Company".

Если бы это был Keil, то я бы так и написал. Это добро из комплекта RVDS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...