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

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> проблемы с байтовым инструкциями, stm32f767
klen
сообщение Feb 12 2017, 23:22
Сообщение #1


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

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



Здравствуюйте.
Начал осваивать 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 он байтовый кусок вычитать из переферийного адреса?
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Feb 13 2017, 00:02
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



заглянул в 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 - Feb 13 2017, 00:18
Go to the top of the page
 
+Quote Post
klen
сообщение Feb 13 2017, 11:13
Сообщение #3


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

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



Цитата(Genadi Zawidowski @ Feb 13 2017, 03:02) *
заглянул в RM0410.PDF.
Регистра DMA_CR не нашел, но на странице 262 встретилось вот такое:

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

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


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

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

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

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

еще раз убеждаемся - не просто читать даташит а читать ВНИМАТЕЛЬНО! в моем случае выло как обычно - смотриш в книгу - видиш фигу sm.gif вечер воскресения бесполезно убит этой глупостью.
Go to the top of the page
 
+Quote Post
adnega
сообщение Feb 13 2017, 13:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(klen @ Feb 13 2017, 14:13) *
ну он думает если ты бит изменяеш в слове то достаточно только байт модифицировать.

А как вы описываете бит? По моему так не должно быть.
Я описываю так
Код
DWORD none:1;
и надеюсь увидеть 32-битный доступ.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Feb 13 2017, 13:15
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(klen @ Feb 13 2017, 14:13) *
... в моем случае выло как обычно - смотриш в книгу - видиш фигу sm.gif ...

При всем уважении, меня не удивляет. laughing.gif
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Feb 13 2017, 14:53
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(klen @ Feb 13 2017, 14:13) *
тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код.

IAR так делает. У него там несколько разных хидеров. И такой тоже есть.
Go to the top of the page
 
+Quote Post
Alechek
сообщение Feb 13 2017, 15:34
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 241
Регистрация: 15-11-05
Из: Челябинск
Пользователь №: 10 882



Цитата(SasaVitebsk @ Feb 13 2017, 19:53) *
IAR так делает.

Раньше пользовал. Сейчас стараюсь использовать заголовочники под процессор в с стиле CMSIS.
Так более универсальней получается и меньше кода если несколько бит одновременно изменить надо.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 13 2017, 17:17
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(klen @ Feb 13 2017, 14:13) *
тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код.

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
KRS
сообщение Feb 13 2017, 17:20
Сообщение #9


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



IAR - делает!
но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям!
Go to the top of the page
 
+Quote Post
klen
сообщение Feb 13 2017, 22:02
Сообщение #10


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

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



Цитата(KRS @ Feb 13 2017, 20:20) *
IAR - делает!
но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям!

ну я еще придумаю как это обустроить sm.gif

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

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

велосипед вещь фундаментальная как инь и янь! подозреваю что велосипед это средство перемещения в будующее где у тебя уже будет опыт им не пользоватся
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 13 2017, 22:22
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(klen @ Feb 14 2017, 01:02) *
в случае с битовыми полями компилятор обнаружит несоответствие типов и ругнется застатвив все сделать правильно.

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

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

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

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

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

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


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 14 2017, 06:58
Сообщение #12


Гуру
******

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



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


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


--------------------
На любой вопрос даю любой ответ
"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
scifi
сообщение Feb 14 2017, 07:08
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(klen @ Feb 14 2017, 01:02) *
зачем это надо?
при расписывании полей можно указать тип этого поля и в перечислении все его допустимые значения.
в таком виде при написании кода пропадает возможность наступить на мои любимые грабли - записать задефайненый бит одного похоженго регистра в другой похожий регистр или перепутать флаги ...

Сие есть страдание от безделья. Этот класс ошибок совсем не страшный, ибо обнаруживается сразу же по факту того, что код просто не работает.
Ну и да, язык не даёт никаких гарантий, что не будет использован побайтовый доступ, поэтому раскидывать себе грабли на этом поле едва ли разумно.
Go to the top of the page
 
+Quote Post
Kabdim
сообщение Feb 14 2017, 07:37
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



Цитата(Forger @ Feb 14 2017, 01:22) *
единожды пройдя путь библиотеко-писателя .... wacko.gif

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

А все проблемы с байтовым доступом от ленности. Когда переделываешь регистры на такой манер нужно как мантру использовать:
Код
reg_struct temp = *reg;
<work>
*reg = temp;

Атомарность много для каких регистром важна и лучше даже не начинать крутить биты "на горячую". Понятное дело это можно и нужно по вкусу обернуть в макросы/raii.
Go to the top of the page
 
+Quote Post
Forger
сообщение Feb 14 2017, 07:43
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(Kabdim @ Feb 14 2017, 10:37) *
Истинный программист не может пройти этот путь, тем более единожды. sm.gif
То был сарказм sm.gif



--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th August 2025 - 22:10
Рейтинг@Mail.ru


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