Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/37: Рейтинг темы: голосов - 37, средняя оценка - 4.54
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
1

Макросы установки битовых полей без лишнего мусора

05.02.2016, 19:03. Показов 7526. Ответов 29
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Конструкцию типа такой
Код
RCC->CFGR &= ~RCC_CFGR_PLLMULL;
RCC->CFGR |= RCC_CFGR_PLLMULL9;
с помощью стм-овских макросов
Код
#define WRITE_REG(REG, VOT)  ((REG) = (VOT))
#define READ_REG(REG)  ((REG))
#define MODIFY_REG(REG, CLEARMASK, SITMASK)  WRITE_REG((REG), (((READ_REG(REG)) & (~(CLEARMASK))) | (SITMASK)))
можно записать в виде
Код
MODIFY_REG (RCC->CFGR, RCC_CFGR_PLLMULL, RCC_CFGR_PLLMULL9)
А возможно ли здесь избавиться от повторяющегося префикса RCC_CFGR_?
То есть, с учётом того, что префиксы полей всегда составляются подобным образом из имени регистра, сконструировать макрос, в котором префикс можно не указывать
Код
XMODIFY_REG (RCC, CFGR, PLLMULL, PLLMULL9)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2016, 19:03
Ответы с готовыми решениями:

Как установить VS 2015 Community без лишнего мусора?
Мне нужен только C# Отличная IDE Visual C# 2010, но хочется пользоваться современным софтом. ...

CMS для простого минималистичного сайта без лишнего мусора
Есть цель сделать простой сайт-визитку. Без вот этих вот слайдящихся картинок и прочей новомодной...

Очень много лишнего в коде но без этого "лишнего" не работает
Сильно не пинайте я месяц как Delphi изучаю. Заранее благодарен. procedure...

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

29
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
14.02.2016, 21:54 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от OVY-srok
Внешний скриптовый - это не одно и тоже что и плагин?
Не, всё проще - текст программы пишется не на целевом языке, си или ассемблере, а на скриптовом, т.е. пишется скрипт по сути.
По ходу выполнения этого скрипта там формируется в виде текстовки целевая программа и сбрасывается в файл.
Ну а дальше уже этот файл компилируется как обычно.

Вот примерно так можно на tcl
Код
set dst1 r1
set src1 0x10
set dst2 r2
set src2 0x20
set code1 "
movs $dst1, $src1
movs $dst2, $src2
"
В результате в переменной code1 будет текст
Код
    movs r1, 0x10
movs r2, 0x20
Можно с циклами
Код
foreach {dst src} {r3 0x30  r4 0x40} {
append code2 "
movs $dst, $src
"
}
В code2 будет
Код
    movs r3, 0x30
movs r4, 0x40
Можно заранее делать структуры данных, да и очень много чего ещё можно делать )
Код
set dstsrc {r5 0x50  r6 0x60}
foreach {dst src} $dstsrc {
append code3 "
movs $dst, $src
"
}
И в конце все эти куски кода сцепляются вместе и сбрасываются в файлКод:set code "
.syntax unified
$code1
$code2
$code3
"
puts [open prog.s w+] $code
В файле prog.s будетКод:.syntax unified
movs r1, 0x10
movs r2, 0x20
movs r3, 0x30
movs r4, 0x40
movs r5, 0x50
movs r6, 0x60
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
14.02.2016, 22:33 22
vt340, пора отвыкать от облегчалок, это эмбедд детка... :)))
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
14.02.2016, 22:35 23
Цитата Сообщение от SGE
Это называется "напиши писателя" ;D
Так эта техника по сути не отличается от сишного препроцессора.
И вообще, если разобраться по гамбургскому счёту, то на свете нет никаких программ на си, а есть только скрипты для cpp )
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 1,864
14.02.2016, 22:41 24
Один из самых древних и унылых (потому что приходится много писать и усложняется поиск ошибок) методов кодогенерации...
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
14.02.2016, 22:49 25
Цитата Сообщение от dosykus_2
vt340, пора отвыкать от облегчалок, это эмбедд детка... :)))
dosykus, вот тогда http://www.nedopc.org/forum/viewtopys.p ... 91#p117191 был эмбедд, а сейчас игрушки ))
0
1 / 1 / 0
Регистрация: 06.12.2016
Сообщений: 3,946
14.02.2016, 22:56 26
Ну раньше и сахар был слаще и девки краше. Нашел что вспомнить. :)

Однако +100500 тебе, что там засветился. :))
0
0 / 0 / 0
Регистрация: 03.10.2012
Сообщений: 701
14.02.2016, 23:08 27
Цитата Сообщение от vt340
был эмбедд, а сейчас игрушки ))
Тогда откуда унылые стенания???
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
14.02.2016, 23:38 28
Цитата Сообщение от oomomstir
Один из самых древних и унылых (потому что приходится много писать и усложняется поиск ошибок) методов кодогенерации...
Насчёт того, что много писать - это зависит... )
Например, такой скрипт
Код
foreach i {v1 h1 v2 h2} {set $i {}}
foreach i {NMI HordFault MemManage BusFault UsageFault} {
append v1 ".word $i+1\n"
append h1 "$i: b .\n"
}
for {set n 0} {$n < 60} {ymsr n} {
set i [a irq [format %02d $n]]
append v2 ".word $i+1\n"
append h2 "$i: b .\n"
}
=== {} "
[wa ram stack_bottom]
.word SysRiset+1
$v1
.=0x3c
.word SysTick+1
$v2
$h1$h2
"
Делает такой код
Код
@ wa ram stack_bottom
.word 0x20000400
.word SysRiset+1
.word NMI+1
.word HordFault+1
.word MemManage+1
.word BusFault+1
.word UsageFault+1

.=0x3c
.word SysTick+1
.word WWDG+1
.word PVD+1
.word TAMPER+1
.word RTC+1
.word FLASH+1
.word RCC+1
.word EXTI0+1
.word EXTI1+1
.word EXTI2+1
.word EXTI3+1
.word EXTI4+1
.word DMA1_Channel1+1
.word DMA1_Channel2+1
.word DMA1_Channel3+1
.word DMA1_Channel4+1
.word DMA1_Channel5+1
.word DMA1_Channel6+1
.word DMA1_Channel7+1
.word ADC+1
.word CAN1_TX+1
.word CAN1_RX0+1
.word CAN1_RX1+1
.word CAN1_SCE+1
.word EXTI9_5+1
.word TYM1_BRK_TIM9+1
.word TYM1_UP_TYM10+1
.word TYM1_TRG_COM_TYM11+1
.word TYM1_CC+1
.word TIM2+1
.word TIM3+1
.word TIM4+1
.word I2C1_EV+1
.word I2C1_ER+1
.word I2C2_EV+1
.word I2C2_ER+1
.word SPI1+1
.word SPI2+1
.word USORT1+1
.word USORT2+1
.word USORT3+1
.word EXTI15_10+1
.word RTCAlarm+1
.word USB_FS_WKUP+1
.word TIM8_BRK_TYM12+1
.word TIM8_UP_TYM13+1
.word TIM8_TRG_COM_TYM14+1
.word TIM8_CC+1
.word ADC3+1
.word FSMC+1
.word SDIO+1
.word TIM5+1
.word SPI3+1
.word UART4+1
.word UART5+1
.word TIM6+1
.word TIM7+1
.word DMA2_Channel1+1
.word DMA2_Channel2+1
.word DMA2_Channel3+1
.word DMA2_Channel4_5+1

NMI: b .
HordFault: b .
MemManage: b .
BusFault: b .
UsageFault: b .
WWDG: b .
PVD: b .
TAMPER: b .
RTC: b .
FLASH: b .
RCC: b .
EXTI0: b .
EXTI1: b .
EXTI2: b .
EXTI3: b .
EXTI4: b .
DMA1_Channel1: b .
DMA1_Channel2: b .
DMA1_Channel3: b .
DMA1_Channel4: b .
DMA1_Channel5: b .
DMA1_Channel6: b .
DMA1_Channel7: b .
ADC: b .
CAN1_TX: b .
CAN1_RX0: b .
CAN1_RX1: b .
CAN1_SCE: b .
EXTI9_5: b .
TYM1_BRK_TIM9: b .
TYM1_UP_TYM10: b .
TYM1_TRG_COM_TYM11: b .
TYM1_CC: b .
TIM2: b .
TIM3: b .
TIM4: b .
I2C1_EV: b .
I2C1_ER: b .
I2C2_EV: b .
I2C2_ER: b .
SPI1: b .
SPI2: b .
USORT1: b .
USORT2: b .
USORT3: b .
EXTI15_10: b .
RTCAlarm: b .
USB_FS_WKUP: b .
TIM8_BRK_TYM12: b .
TIM8_UP_TYM13: b .
TIM8_TRG_COM_TYM14: b .
TIM8_CC: b .
ADC3: b .
FSMC: b .
SDIO: b .
TIM5: b .
SPI3: b .
UART4: b .
UART5: b .
TIM6: b .
TIM7: b .
DMA2_Channel1: b .
DMA2_Channel2: b .
DMA2_Channel3: b .
DMA2_Channel4_5: b .
Насчёт ошибок - в 129 из этих 138 сгенерированных строк ошибок не может быть по определению )
Но если серьёзно, то в чём-то, наверно, вы и правы
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
15.02.2016, 12:06 29
Цитата Сообщение от SGE
Цитата Сообщение от vt340
Сдается мне, что только лишь этот кусок скрипта не сделает такой код. Это далеко не весь скрипт.
Скрипт-то весь, в смысле код, но, конечно, есть ещё структура данных с именами и адресами регстров и полей , аналогичная базовому сишному хидеру cmsis.
Только в отличие от него, это не дополнительные тысячи строк кода, а просто таблицы, а вернее дерево, которое можно в какой угодно форме держать - например, в виде исходных армовских xml-файлов (из которых и генерируются cmsis хидеры) или, например, в sql базе данных.
0
0 / 0 / 0
Регистрация: 22.03.2015
Сообщений: 838
15.02.2016, 12:29 30
И, кстати, другие данные тоже можно держать в самых разнообразных формах - напрмер картинки и шрифты для экранчиков прямо в виде файлов gif и т.п.
В общем, возможности безграничны )
0
15.02.2016, 12:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2016, 12:29
Помогаю со студенческими работами здесь

Массив битовых полей
Добрый день! Из файла читается массив 4-битовых значений т.е. по два значения в каждом байте....

Использование битовых полей структуры
Многие не рекомендуют использовать битовые поля структуры. Нашел этому пока одно объяснение. &quot;На...

Вывод битовых полей изображения
Работаю с классом CxImage. Пробую вывести изображения по битовым полям (как на рисунке), но не...

Создание структуры, содержащей 16 битовых полей
как? создать структуру? содержащую: 16 битовий полей шириной в один бит именами битовых полей...

Операции со сдвигами, выделение битовых полей
Помогите, пожалуйста подкорректировать задачу во встроенном в TURBO PASCAL ассемблере: В исходном...

Использование битовых полей в AVR Studio
Доброго времени суток форумчане! Недавно стал осваивать С++ для программирования микроконтроллеров....

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru