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

проблемы с байтовым инструкциями

Здравствуюйте.

Начал осваивать F7

компилятор генерит код:

NOP();
08000684:   nop     
08000686:   ldrb    r5, [r6, #0]
08000688:   orr.w   r4, r5, #1
0800068c:   strb    r4, [r6, #0]
08000684:   nop

 

содержание регистров r4,r5,r6

r4 268436096

r5 640

r6 0x40026010 (Hex)

 

байтовая инструкция ldrb r5, [r6, #0] вызывает вываливание в hard fault? в тоже время переписанный код который организован как чтение слова по томуже адресу не вызывает исключительной ситуации. чтение регистра DMA_CR. при этом же такое же байтовое чтение модификация записm проканывает с регистром RCC AHB1

 

так должно быть - неможеn он байтовый кусок вычитать из переферийного адреса?

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


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

заглянул в RM0410.PDF.

Регистра DMA_CR не нашел, но на странице 262 встретилось вот такое:

8.5 DMA registers

The DMA registers have to be accessed by words (32 bits).

Как оно могло такое нагенерить, если регистр volatile и 32 бита?

 

Из другого места (опять не понятно про что вопрос - с регистром RCC AHB1):

5.3.10 RCC APB1 peripheral clock enable register (RCC_APB1ENR)

Address offset: 0x40

Reset value: 0x0000 0000

Access: no wait state, word, half-word and byte access.

 

А hard fault как-бы намекает, что так (байтом) нельзя.

Изменено пользователем Genadi Zawidowski

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


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

заглянул в RM0410.PDF.

Регистра DMA_CR не нашел, но на странице 262 встретилось вот такое:

 

Как оно могло такое нагенерить, если регистр volatile и 32 бита?

 

Из другого места (опять не понятно про что вопрос - с регистром RCC AHB1):

 

 

А hard fault как-бы намекает, что так (байтом) нельзя.

спасибо! вопросов больше не имею. спасибо что тыкнули мордой даташит. я просто не дочитал до этого места думая что как у других регистров возможна байтовый доступ. печально. теперь буду внимательнее.

код компиллер нагенерил так потому что я сам его так попросил.

 

тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код. в DMA вылезло что так нельзя потому что тогда компиллер генерить код вытягивания модификации и записи байта - ну он думает если ты бит изменяеш в слове то достаточно только байт модифицировать.

 

но я придумал как обойти это ограничение.

 

еще раз убеждаемся - не просто читать даташит а читать ВНИМАТЕЛЬНО! в моем случае выло как обычно - смотриш в книгу - видиш фигу :) вечер воскресения бесполезно убит этой глупостью.

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


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

ну он думает если ты бит изменяеш в слове то достаточно только байт модифицировать.

А как вы описываете бит? По моему так не должно быть.

Я описываю так

DWORD none:1;

и надеюсь увидеть 32-битный доступ.

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


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

... в моем случае выло как обычно - смотриш в книгу - видиш фигу :) ...

При всем уважении, меня не удивляет. :laughing:

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


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

тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код.

IAR так делает. У него там несколько разных хидеров. И такой тоже есть.

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


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

IAR так делает.

Раньше пользовал. Сейчас стараюсь использовать заголовочники под процессор в с стиле CMSIS.

Так более универсальней получается и меньше кода если несколько бит одновременно изменить надо.

 

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


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

тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код.

Может быть, я стал старый и дремучий, но никак не пойму чем не устраивает уже готовые h-файлы, где самим производителем проца уже описаны соотв. структурами и дефайнами все регистры и битовые поля???

В данном случае на объем кода это никак не влияет, а времени и нервов экономит вагон и маленькую тележку...

Ей богу не пойму, зачем изобретать велосипед в данном случае ... :laughing:

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


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

IAR - делает!

но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям!

 

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


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

IAR - делает!

но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям!

ну я еще придумаю как это обустроить :)

 

зачем это надо?

при расписывании полей можно указать тип этого поля и в перечислении все его допустимые значения.

в таком виде при написании кода пропадает возможность наступить на мои любимые грабли - записать задефайненый бит одного похоженго регистра в другой похожий регистр или перепутать флаги ...

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

 

например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении :)

 

велосипед вещь фундаментальная как инь и янь! подозреваю что велосипед это средство перемещения в будующее где у тебя уже будет опыт им не пользоватся

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


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

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

Для этого есть готовый HAL, а для особо ленивых есть "куб".

 

Если HAL и куб не кошерно, то можно просто написать свою либу:

надрать кусков из примеров под HAL, отладить их, наделав своих примеров и торжественно закопать все эти сомнительные вещи единожды пройдя путь библиотеко-писателя .... :wacko:

 

У меня самописная библиотека есть тока для пинов, т. к. дрыгать ногами лучше с минимальных оверхедом - HAL в этом смысле сильно проигрывает прямому обращению к соотв. регистрам.

 

Все остальное даже с использованием куба не шибко влияет на производительность - периферия инициализируется обычно единожды при старте камня, а далее юзаются лишь примитивные функции и относительно редко.

Оверхед на старте проца не критичен, там можно тупо пользовать HAL как есть, а далее в коде (когда проц уже долбит во всю) для пущей производительности можно нагло выдрать код из HAL и напихать его в свой проект.

 

например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении :)

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

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


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

например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении :)
Ой ли. На каком языке вы пишете? Дело в том, что "голый" Си должен делать неявное преобразование enum->int и дальше тоже неявное int->другой enum. Поэтому в "голом" Си enumы практически бесполезны. Максимум, чего от них можно ожидать - указание конкретного символического имени для комбинации битов в отладчике. В плюсах неявное преобразование int->enum запрещено, поэтому такой номер проходит. Но следующим этапом встает проблема области видимости - нельзя иметь два enum со значением, скажем, OFF. Эта проблема решена в C++11 (enum class), но там они родили другую - у них enum class не лезет в битовое поле.

 

 

Просто я в свое время тоже пытался решить эту проблему, но рабочего решения так и не нашел. Понял, что это реализуемо через гору писанины на шаблонах, но на такой подвиг я пока не готов.

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


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

зачем это надо?

при расписывании полей можно указать тип этого поля и в перечислении все его допустимые значения.

в таком виде при написании кода пропадает возможность наступить на мои любимые грабли - записать задефайненый бит одного похоженго регистра в другой похожий регистр или перепутать флаги ...

Сие есть страдание от безделья. Этот класс ошибок совсем не страшный, ибо обнаруживается сразу же по факту того, что код просто не работает.

Ну и да, язык не даёт никаких гарантий, что не будет использован побайтовый доступ, поэтому раскидывать себе грабли на этом поле едва ли разумно.

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


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

единожды пройдя путь библиотеко-писателя .... :wacko:

Истинный программист не может пройти этот путь, тем более единожды. :)

 

А все проблемы с байтовым доступом от ленности. Когда переделываешь регистры на такой манер нужно как мантру использовать:

reg_struct temp = *reg;
<work>
*reg = temp;

Атомарность много для каких регистром важна и лучше даже не начинать крутить биты "на горячую". Понятное дело это можно и нужно по вкусу обернуть в макросы/raii.

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


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

Истинный программист не может пройти этот путь, тем более единожды. :)
То был сарказм :)

 

 

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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