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

 
 
> strex/b/h
klen
сообщение Nov 28 2011, 22:05
Сообщение #1


бессмертным стать можно тремя способами
*****

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



Цитата(klen @ Nov 28 2011, 20:57) *
1. как то мимо проехал, просто закаментил CMSIS две эти функции потому как не разбирался - кто врет: асм на наличие двух одинаковых регистров, или компилятор врет при их генерации. судя по доке для strexb и strexb это не воспрещаться но и не написано что можно (я решил ничего не предпринимать по поводу этого косяка). этот тонкий момент я оставил на потом. кто точно знает как работает ядро по этому вопросу сообщите.
2. моя рабочая гипотеза - врет ассемблер, если так то его можно быстренько подправить (если не будет подводных камней).

2_AHTOXA
на мой взгляд они все правильно делают - открылись новые обстаятельства - рефаторинг проекта, а то и редизайнинг пока не позно!! а не ''рекостылинг" ка это делают большенство обезьяноподобных.... нехрен грязь размазывать во времени и пространстве - сразу жопу вытер, помыл и забыл. я бы также сделал. проблем то никаких - имя скрипта поменял и все.




немного изменил в ассемблере проверку регистров в инструкциях strexb/strexh, теперь таких сообщений не должно быть:
/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]'
теперь первый операнд не проверяется на равенство со вторым, одеако сравнивается с третьим и в случае совпадения будет сообщение об ошибке
тут нада покурить доку ARM CM3 и понять как правильно нада поступать. мгне описание кажется неоднозначным.
http://infocenter.arm.com/help/index.jsp?t...a/BABFFBJB.html
нада посовещатся

http://klen.org/Files/DevTools/x86_32-kgp-..._32-20111129.7z

сборка релизная для виды 32бит, полная копия 20111126 , за исключением binutils (троганный моими руками twak.gif )
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
IgorKossak
сообщение Mar 13 2012, 08:58
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 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
Go to the top of the page
 
+Quote Post
klen
сообщение Mar 14 2012, 06:36
Сообщение #3


бессмертным стать можно тремя способами
*****

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



Цитата(IgorKossak @ Mar 13 2012, 12:58) *
Может уже где то проскакивало, но поиском не нашёл.


мы тут это уже проходили. смысл в том что ассемблер ругается на два одинаковых операнда, а в доке на кортекс сказано что это в даном случае возможно. поэтому cmsis прав. я правил as (убирал условие которое приводит к ошике по ситуации с двумя одинаковыми операндами) и выкладывал здесь выше сборку в которой ассемблер проглатывал код.
так что да, кто не хочет заморачиватся с тулсами - проще инлайн асм strbex и иже с ними порпавить в cmsis на использование трех операндов а не двух.

для конкретности отмечу - это косяг не gcc а binutils ( а именно ассемблера)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 14 2012, 07:01
Сообщение #4


Гуру
******

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



QUOTE (klen @ Mar 14 2012, 08:36) *
а в доке на кортекс сказано что это в даном случае возможно. поэтому cmsis прав.
Где-то мне попадалось объяснение, со ссылками на доку от кортексов, что binutils таки прав, а неправ cmsis. Чуть ли не багтрекере binutils. Постараюсь найти позже.


--------------------
На любой вопрос даю любой ответ
"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
klen
сообщение Mar 14 2012, 07:25
Сообщение #5


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 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] у меня при тестах работало sm.gif ревизия ядра с ошибками???? laughing.gif
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Mar 14 2012, 09:08
Сообщение #6


фанат дивана
******

Группа: Свой
Сообщений: 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).


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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