klen 1 12 февраля, 2017 Опубликовано 12 февраля, 2017 · Жалоба Здравствуюйте. Начал осваивать 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 он байтовый кусок вычитать из переферийного адреса? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GenaSPB 11 13 февраля, 2017 Опубликовано 13 февраля, 2017 (изменено) · Жалоба заглянул в 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 как-бы намекает, что так (байтом) нельзя. Изменено 13 февраля, 2017 пользователем Genadi Zawidowski Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба заглянул в RM0410.PDF. Регистра DMA_CR не нашел, но на странице 262 встретилось вот такое: Как оно могло такое нагенерить, если регистр volatile и 32 бита? Из другого места (опять не понятно про что вопрос - с регистром RCC AHB1): А hard fault как-бы намекает, что так (байтом) нельзя. спасибо! вопросов больше не имею. спасибо что тыкнули мордой даташит. я просто не дочитал до этого места думая что как у других регистров возможна байтовый доступ. печально. теперь буду внимательнее. код компиллер нагенерил так потому что я сам его так попросил. тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код. в DMA вылезло что так нельзя потому что тогда компиллер генерить код вытягивания модификации и записи байта - ну он думает если ты бит изменяеш в слове то достаточно только байт модифицировать. но я придумал как обойти это ограничение. еще раз убеждаемся - не просто читать даташит а читать ВНИМАТЕЛЬНО! в моем случае выло как обычно - смотриш в книгу - видиш фигу :) вечер воскресения бесполезно убит этой глупостью. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба ну он думает если ты бит изменяеш в слове то достаточно только байт модифицировать. А как вы описываете бит? По моему так не должно быть. Я описываю так DWORD none:1; и надеюсь увидеть 32-битный доступ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба ... в моем случае выло как обычно - смотриш в книгу - видиш фигу :) ... При всем уважении, меня не удивляет. :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код. IAR так делает. У него там несколько разных хидеров. И такой тоже есть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Alechek 0 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба IAR так делает. Раньше пользовал. Сейчас стараюсь использовать заголовочники под процессор в с стиле CMSIS. Так более универсальней получается и меньше кода если несколько бит одновременно изменить надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба тема связана с тем что я делаю такую штуку - описываю регистры как структуры с битовыми полями. так удобнее писать код. Может быть, я стал старый и дремучий, но никак не пойму чем не устраивает уже готовые h-файлы, где самим производителем проца уже описаны соотв. структурами и дефайнами все регистры и битовые поля??? В данном случае на объем кода это никак не влияет, а времени и нервов экономит вагон и маленькую тележку... Ей богу не пойму, зачем изобретать велосипед в данном случае ... :laughing: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба IAR - делает! но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
klen 1 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба IAR - делает! но у него запись битовых полей в 32 разрядные регистры не приводит к байтовым операциям! ну я еще придумаю как это обустроить :) зачем это надо? при расписывании полей можно указать тип этого поля и в перечислении все его допустимые значения. в таком виде при написании кода пропадает возможность наступить на мои любимые грабли - записать задефайненый бит одного похоженго регистра в другой похожий регистр или перепутать флаги ... в случае с битовыми полями компилятор обнаружит несоответствие типов и ругнется застатвив все сделать правильно. например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении :) велосипед вещь фундаментальная как инь и янь! подозреваю что велосипед это средство перемещения в будующее где у тебя уже будет опыт им не пользоватся Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 13 февраля, 2017 Опубликовано 13 февраля, 2017 · Жалоба в случае с битовыми полями компилятор обнаружит несоответствие типов и ругнется застатвив все сделать правильно. Для этого есть готовый HAL, а для особо ленивых есть "куб". Если HAL и куб не кошерно, то можно просто написать свою либу: надрать кусков из примеров под HAL, отладить их, наделав своих примеров и торжественно закопать все эти сомнительные вещи единожды пройдя путь библиотеко-писателя .... У меня самописная библиотека есть тока для пинов, т. к. дрыгать ногами лучше с минимальных оверхедом - HAL в этом смысле сильно проигрывает прямому обращению к соотв. регистрам. Все остальное даже с использованием куба не шибко влияет на производительность - периферия инициализируется обычно единожды при старте камня, а далее юзаются лишь примитивные функции и относительно редко. Оверхед на старте проца не критичен, там можно тупо пользовать HAL как есть, а далее в коде (когда проц уже долбит во всю) для пущей производительности можно нагло выдрать код из HAL и напихать его в свой проект. например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении :) Но при этом появляется возможно наступать на такие детские грабли, как описано начале темы.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба например теперь невозможно записать в поля номера канала регистра DMAx_STREAMy.channel канал которого нет - его не будет в перечислении :)Ой ли. На каком языке вы пишете? Дело в том, что "голый" Си должен делать неявное преобразование enum->int и дальше тоже неявное int->другой enum. Поэтому в "голом" Си enumы практически бесполезны. Максимум, чего от них можно ожидать - указание конкретного символического имени для комбинации битов в отладчике. В плюсах неявное преобразование int->enum запрещено, поэтому такой номер проходит. Но следующим этапом встает проблема области видимости - нельзя иметь два enum со значением, скажем, OFF. Эта проблема решена в C++11 (enum class), но там они родили другую - у них enum class не лезет в битовое поле. Просто я в свое время тоже пытался решить эту проблему, но рабочего решения так и не нашел. Понял, что это реализуемо через гору писанины на шаблонах, но на такой подвиг я пока не готов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба зачем это надо? при расписывании полей можно указать тип этого поля и в перечислении все его допустимые значения. в таком виде при написании кода пропадает возможность наступить на мои любимые грабли - записать задефайненый бит одного похоженго регистра в другой похожий регистр или перепутать флаги ... Сие есть страдание от безделья. Этот класс ошибок совсем не страшный, ибо обнаруживается сразу же по факту того, что код просто не работает. Ну и да, язык не даёт никаких гарантий, что не будет использован побайтовый доступ, поэтому раскидывать себе грабли на этом поле едва ли разумно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kabdim 0 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба единожды пройдя путь библиотеко-писателя .... Истинный программист не может пройти этот путь, тем более единожды. :) А все проблемы с байтовым доступом от ленности. Когда переделываешь регистры на такой манер нужно как мантру использовать: reg_struct temp = *reg; <work> *reg = temp; Атомарность много для каких регистром важна и лучше даже не начинать крутить биты "на горячую". Понятное дело это можно и нужно по вкусу обернуть в макросы/raii. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 17 14 февраля, 2017 Опубликовано 14 февраля, 2017 · Жалоба Истинный программист не может пройти этот путь, тем более единожды. :)То был сарказм :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться