|
Атомарность bit-banding в Cortex-M3 |
|
|
|
 |
Ответов
(1 - 13)
|
Mar 10 2012, 07:08
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(alt3857 @ Mar 10 2012, 09:01)  Привет. Возникли сомнения по поводу атомарности операции bit-banding. Во всех доках пишут, что данная операция обеспечивает атомарный доступ к битам периферии и RAM, но компилятор Keil генерирует три инструкции: MOV r0,#0x01 LDR r1,[pc,#28] ; @0x000012D4 STR r0,[r1,#0x64] А если между ними произойдет прерывание? имеется ввиду атомарность операции str. Ибо адрес и само значение может быть загружено заранее. Авот если без битбанга, то тогда сложнее - ldr r1, [r2] orr r1,#1 str r1, [r2] во втором регистре адрес порта. т.е. атомарной должно быть чтение-модификация-запись.
|
|
|
|
|
Mar 10 2012, 07:41
|
Частый гость
 
Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299

|
Цитата А если между ними произойдет прерывание? обращение к порту происходит только в последней команде. Это и есть атомарность. Цитата И где же здесь атомарность?? здесь - нигде
|
|
|
|
|
Mar 10 2012, 09:54
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 26-12-11
Пользователь №: 69 097

|
Цитата("alt3857") но компилятор Keil генерирует три инструкции: ... перейдите на ARM-ассемблер и скорее всего возможностей битбанга хватит....
|
|
|
|
|
Mar 10 2012, 10:20
|
Частый гость
 
Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299

|
Цитата перейдите на ARM-ассемблер и скорее всего возможностей битбанга хватит. чем тут поможет ассемблер ? в ARMе нет другого способа читать/писать память кроме как через загрузку адреса и данных в регистры, в отличии от AVR где есть IN/OUT и LDS/STS. Поэтому в первом примере нужны сначала 2 команды загрузки в регистры адреса и данных, только потом идет обращение к периферии.
Сообщение отредактировал zöner - Mar 10 2012, 10:21
|
|
|
|
|
Mar 10 2012, 11:44
|

Участник

Группа: Участник
Сообщений: 31
Регистрация: 26-12-11
Пользователь №: 69 097

|
Цитата("zöner") чем тут поможет ассемблер ? в ARMе нет другого способа читать/писать память кроме как через загрузку адреса и данных в регистры... ... тем, что адрес не нужно грузить повторно ЗЫ. вообще-то автор топика задал вопрос в стиле "угадай зачем мне это нужно" , а гадать не охота......
|
|
|
|
|
Mar 10 2012, 12:29
|
Частый гость
 
Группа: Участник
Сообщений: 195
Регистрация: 16-02-12
Пользователь №: 70 299

|
Цитата ... тем, что адрес не нужно грузить повторно думаете С-оптимизатор этого не поймет ? Цитата вообще-то автор топика задал вопрос в стиле "угадай зачем мне это нужно" , а гадать не охота...... скорее не совсем понял что такое атомарность доступа к портам и где она зарыта в коде из первого поста
|
|
|
|
|
Mar 10 2012, 13:42
|

неотягощённый злом
     
Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643

|
Цитата(alt3857 @ Mar 10 2012, 09:01)  Привет. Возникли сомнения по поводу атомарности операции bit-banding. Во всех доках пишут, что данная операция обеспечивает атомарный доступ к битам периферии и RAM, но компилятор Keil генерирует три инструкции: MOV r0,#0x01 LDR r1,[pc,#28] ; @0x000012D4 STR r0,[r1,#0x64] А если между ними произойдет прерывание? Ничего страшного не произойдёт, т.к модификация бита происходит атомарно за одну инструкцию STR. В отличие от Код ldr r1, [r2] orr r1,#1 str r1, [r2] где возникшее после первой или второй инструкции прерывание может потерять результаты своего изменения ячейки памяти по адресу [r2] из-за того что она (ячейка) была закеширована в r1 во время выполнения прерывания.
--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
|
|
|
|
|
Mar 11 2012, 15:59
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(zöner @ Mar 10 2012, 13:41)  обращение к порту происходит только в последней команде. Это и есть атомарность.здесь - нигде Перечитайте внимательнее начальное сообщение. Там говорится о "атомарности операции bit-banding", а не атомарности доступа к порту. Сделать эту последовательность из 3-х команд атомарной можно тока запретом прерываний. Тогда как в 1-м случае, как я понимаю, используется спец. адресное пространство и команда STR r0,[r1,#0x64] модифицирует только заданные биты ячейки памяти (заданные маской или номером бита в R0).
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|