|
проблемы с байтовым инструкциями, stm32f767 |
|
|
|
Feb 12 2017, 23:22
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 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 он байтовый кусок вычитать из переферийного адреса?
|
|
|
|
|
Feb 13 2017, 00:02
|

Профессионал
    
Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 13 2017, 11:13
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 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 вылезло что так нельзя потому что тогда компиллер генерить код вытягивания модификации и записи байта - ну он думает если ты бит изменяеш в слове то достаточно только байт модифицировать. но я придумал как обойти это ограничение. еще раз убеждаемся - не просто читать даташит а читать ВНИМАТЕЛЬНО! в моем случае выло как обычно - смотриш в книгу - видиш фигу  вечер воскресения бесполезно убит этой глупостью.
|
|
|
|
|
Feb 13 2017, 13:02
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(klen @ Feb 13 2017, 14:13)  ну он думает если ты бит изменяеш в слове то достаточно только байт модифицировать. А как вы описываете бит? По моему так не должно быть. Я описываю так Код DWORD none:1; и надеюсь увидеть 32-битный доступ.
|
|
|
|
|
Feb 13 2017, 17:17
|

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

|
Цитата(klen @ Feb 13 2017, 14:13)  тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код. Может быть, я стал старый и дремучий, но никак не пойму чем не устраивает уже готовые h-файлы, где самим производителем проца уже описаны соотв. структурами и дефайнами все регистры и битовые поля??? В данном случае на объем кода это никак не влияет, а времени и нервов экономит вагон и маленькую тележку... Ей богу не пойму, зачем изобретать велосипед в данном случае ...
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 13 2017, 22:02
|

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

|
Цитата(KRS @ Feb 13 2017, 20:20)  IAR - делает! но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям! ну я еще придумаю как это обустроить  зачем это надо? при расписывании полей можно указать тип этого поля и в перечислении все его допустимые значения. в таком виде при написании кода пропадает возможность наступить на мои любимые грабли - записать задефайненый бит одного похоженго регистра в другой похожий регистр или перепутать флаги ... в случае с битовыми полями компилятор обнаружит несоответствие типов и ругнется застатвив все сделать правильно. например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении велосипед вещь фундаментальная как инь и янь! подозреваю что велосипед это средство перемещения в будующее где у тебя уже будет опыт им не пользоватся
|
|
|
|
|
Feb 13 2017, 22:22
|

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

|
Цитата(klen @ Feb 14 2017, 01:02)  в случае с битовыми полями компилятор обнаружит несоответствие типов и ругнется застатвив все сделать правильно. Для этого есть готовый HAL, а для особо ленивых есть "куб". Если HAL и куб не кошерно, то можно просто написать свою либу: надрать кусков из примеров под HAL, отладить их, наделав своих примеров и торжественно закопать все эти сомнительные вещи единожды пройдя путь библиотеко-писателя .... У меня самописная библиотека есть тока для пинов, т. к. дрыгать ногами лучше с минимальных оверхедом - HAL в этом смысле сильно проигрывает прямому обращению к соотв. регистрам. Все остальное даже с использованием куба не шибко влияет на производительность - периферия инициализируется обычно единожды при старте камня, а далее юзаются лишь примитивные функции и относительно редко. Оверхед на старте проца не критичен, там можно тупо пользовать HAL как есть, а далее в коде (когда проц уже долбит во всю) для пущей производительности можно нагло выдрать код из HAL и напихать его в свой проект. Цитата например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении  Но при этом появляется возможно наступать на такие детские грабли, как описано начале темы....
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Feb 14 2017, 06:58
|

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

|
QUOTE (klen @ Feb 14 2017, 00:02)  например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении  Ой ли. На каком языке вы пишете? Дело в том, что "голый" Си должен делать неявное преобразование 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)
|
|
|
|
|
Feb 14 2017, 07:37
|
Знающий
   
Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842

|
Цитата(Forger @ Feb 14 2017, 01:22)  единожды пройдя путь библиотеко-писателя ....  Истинный программист не может пройти этот путь, тем более единожды.  А все проблемы с байтовым доступом от ленности. Когда переделываешь регистры на такой манер нужно как мантру использовать: Код reg_struct temp = *reg; <work> *reg = temp; Атомарность много для каких регистром важна и лучше даже не начинать крутить биты "на горячую". Понятное дело это можно и нужно по вкусу обернуть в макросы/raii.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|