|
|
  |
strex/b/h |
|
|
|
Mar 13 2012, 08:58
|

Шаман
     
Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221

|
Может уже где то проскакивало, но поиском не нашёл. Что касается: Цитата(klen @ Nov 29 2011, 00:05)  /tmp/cc7ETq9C.s:508: Error: registers may not be the same -- `strexb r0,r0,[r1]' /tmp/cc7ETq9C.s:533: Error: registers may not be the same -- `strexh r0,r0,[r1]' на CodeSourcery рекомендуют сделать следующее: Цитата Question
When compiling applications that contain or use the Cortex Microcontroller Software Interface Standard e.g. CMSIS (http://www.onarm.com/cmsis/) you may receive the following errors: /tmp/ccaxp69S.s: Assembler messages: /tmp/ccaxp69S.s:463: Error: registers may not be the same -- `strexb r0,r0,[r1]' /tmp/ccaxp69S.s:488: Error: registers may not be the same -- `strexh r0,r0,[r1]'
How do I fix these "registers may not be the same" errors? Where do they come from?
Answer
Some versions of the CMSIS contain invalid inline assembly of the following form: uint32_t __STREXB(uint8_t value, uint8_t *addr) { uint32_t result=0; asm volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); }
The first constraint =r on variable result is not correct, it should be =&r to indicate that the two registers used should not be the same e.g. early-clobber (this is required by the ARM Instruction Set Architecture).
To fix the error you must locate the invalid inline assembly and change the =r to =&r for the result register variable.
Often it is difficult to determine which source file was used to generate /tmp/ccaxp69S.s, to help with that problem add -save-temps to the compiler invocation to save the intermediate output to the current directory for your review.
This entry was last updated on 8 February 2012. Т. е. сваливают всё не на компилятор, а на неграмотную строку в инлайн ассемблере. Может это и правильно? Проверил их свежим тулчейном - работает. PS Проверял только на старых проектах с CMSISv1.3
|
|
|
|
|
Mar 13 2012, 09:52
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417

|
В комплекте с тем, что раздаёт NXP для LPC Код /**************************************************************************//** * @file core_cmInstr.h * @brief CMSIS Cortex-M Core Instruction Access Header File * @version V2.01 * @date 06. December 2010 Для IAR так вообще, выходит, сразу неправильно написано: Код #elif (defined (__ICCARM__)) /*---------------- ICC Compiler ---------------------*/ /* IAR iccarm specific functions */ ... static uint32_t __STREXW(uint32_t value, volatile uint32_t *addr) { __ASM("strex r0, r0, [r1]"); } Для gcc надо править: Код #elif (defined (__GNUC__)) /*------------------ GNU Compiler ---------------------*/ /* GNU gcc specific functions */ ... __attribute__( ( always_inline ) ) static __INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr) { uint32_t result;
__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); return(result); }
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Mar 14 2012, 07:25
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Цитата(Сергей Борщ @ Mar 14 2012, 11:01)  Где-то мне попадалось объяснение, со ссылками на доку от кортексов, что binutils таки прав, а неправ cmsis. Чуть ли не багтрекере binutils. Постараюсь найти позже. давайте разбиратся с пристрастием. я помню - читал доку на http://infocenter.arm.com что можно таки strexb rX,rX, [rY].... а теперь еще раз освежаем в памяти и видим: http://infocenter.arm.com/help/topic/com.a...a/BABFFBJB.htmlвот цитата Цитата Restrictions In these instructions: do not use PC do not use SP for Rd and Rt for STREX, Rd must be different from both Rt and Rn the value of offset must be a multiple of four in the range 0-1020. из чего я делаю вывод что : то что запершено для STREX не запрещено для STREXB !! ну явно то не написано что для STREXB нельзя... в свежих CMSIS всетаки все версии иструкции закодены с разными регистрами. вывод такой что CMSIS был с ошибками а binutils правильный НО для всех STREXB STREH пережимает ограничения на операнды также как и для STREX может в описании ограничений на операнды имеется ввиду что STREX это = (STREX,STREXH,STREXB). тогда это явно надо писать а то я че угодно могу тогда домыслить. и еще для раздумий... strexb r0, r0, [r1] у меня при тестах работало  ревизия ядра с ошибками????
|
|
|
|
|
Mar 14 2012, 09:08
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(klen @ Mar 14 2012, 13:25)  может в описании ограничений на операнды имеется ввиду что STREX это = (STREX,STREXH,STREXB). Я именно так и понял. Кстати, сейчас попробовал kgp 20110328 + CMSIS от 19. July 2011, и получил: Код strex r2, r2, [ip] Получается, у меня kgp как раз с исправлениями, а CMSIS - ещё нет? Цитата(ReAl @ Mar 13 2012, 15:52)  Для gcc надо править: Код __ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) ); Так не помогает, нужно: "= &r" (result).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|