Size: a a a

2018 January 31

MC

Mikhail Cheshkov in embedded.rs
она доступна отдельно на сайте ст, как и спл
источник

MC

Mikhail Cheshkov in embedded.rs
источник

AS

Andrew Strokov in embedded.rs
CubeMX это Cube micro explorer, софт для автоконфигурации гуем
источник
2018 February 01

MC

Mikhail Cheshkov in embedded.rs
а зачем генерить чтобы перетрясти
источник

MC

Mikhail Cheshkov in embedded.rs
там мякотка в том, что можно настроить и поименовать пины и периферию в гуи, и имена и настройки сгенерят тебе глобалы и функции
источник

MC

Mikhail Cheshkov in embedded.rs
если ты всё перетрясёшь - потеряешь почти наверное возможность открыть проект и перенастроить что-то
источник

MC

Mikhail Cheshkov in embedded.rs
он там очень своеобразно генерит
источник

MC

Mikhail Cheshkov in embedded.rs
Хотя есть варик написать свой шаблон, чтобы перетрясти всё один раз заранее
источник

MC

Mikhail Cheshkov in embedded.rs
Позырил как устроены шаблоны в кубмх
источник

MC

Mikhail Cheshkov in embedded.rs
Там судя по всему https://freemarker.apache.org/ сог своими тегами на квадратных скобках
источник

MC

Mikhail Cheshkov in embedded.rs
короче судя по всему довольно замороченный движок и язык
источник

MC

Mikhail Cheshkov in embedded.rs
например там есть вот такая жемчужина
[#-- macro generate USB wake-up interrupt code --]
[#macro generateUsbWakeUpInterrupt ipName tabN]
   [#if ipName?contains("_FS")]
       [#if FamilyName=="STM32L4"]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]/* Enable EXTI Line 17 for USB wakeup */
       [#else]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]/* Enable EXTI Line 18 for USB wakeup */
       [/#if]
   [#else]
       [#if FamilyName=="STM32L0"]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]/* Enable EXTI Line 18 for USB wakeup */
       [#else]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]/* Enable EXTI Line 20 for USB wakeup */
       [/#if]
   [/#if]
   [#if FamilyName=="STM32F3"||FamilyName=="STM32L1"]
     [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_WAKEUP_EXTI_CLEAR_FLAG();
     [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE();
   [/#if]
   [#if FamilyName=="STM32F2"||FamilyName=="STM32F4"||FamilyName=="STM32F7"]
       [#if ipName?contains("_FS")]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG();
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE();
       [/#if]
       [#if ipName?contains("_HS")]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_HS_WAKEUP_EXTI_CLEAR_FLAG();
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_RISING_EDGE();
       [/#if]
   [/#if]
   [#if ipName?contains("_HS")]
       [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_HS_WAKEUP_EXTI_ENABLE_IT();
   [#elseif ipName?contains("OTG_FS")&&FamilyName=="STM32F1"]
       [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_FS_WAKEUP_EXTI_CLEAR_FLAG();
       [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_RISING_EDGE();
       [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT();
   [#elseif ipName?contains("OTG_FS")&&FamilyName=="STM32L4"]
       [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT();
   [#elseif ipName?contains("_FS")]
             [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_OTG_FS_WAKEUP_EXTI_ENABLE_IT();
   [#else]
       [#if FamilyName=="STM32F1"]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_WAKEUP_EXTI_CLEAR_FLAG();
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_WAKEUP_EXTI_ENABLE_RISING_EDGE();
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_WAKEUP_EXTI_ENABLE_IT();
       [#else]
           [#if tabN==2]#t#t[#else]#t#t#t[/#if]__HAL_USB_WAKEUP_EXTI_ENABLE_IT();
       [/#if]
   [/#if]
[/#macro]
[#-- End macro generate USB wake-up interrupt code --]
источник

MC

Mikhail Cheshkov in embedded.rs
[#if tabN==2]#t#t[#else]#t#t#t[/#if]
источник

MC

Mikhail Cheshkov in embedded.rs
то есть бывает либо 2 либо 3 таба в этом макросе)
источник

MC

Mikhail Cheshkov in embedded.rs
ну и подбор названия функции по FamilyName это лол
источник

MC

Mikhail Cheshkov in embedded.rs
Или вот

[#macro generateCecRxBuffer configModelList methodName argumentName bufferType bufferSize]
 [#list configModelList as configModel]
   [#if configModel.isMWUsed=="false"]
     [#if configModel.ipName?contains("CEC")]
       [#if configModel.methods??] [#-- if the pin configuration contains a list of LibMethods--]
         [#assign methodList = configModel.methods]
       [#else]
         [#assign methodList = configModel.libMethod]
       [/#if]
       [#list methodList as method]
         [#if method.name==methodName]
           [#if method.status=="OK"]
             [#if method.arguments??]
               [#list method.arguments as fargument]
                 [#if fargument.genericType=="struct"][#-- hcec --]
                   [#list fargument.argument as argument]
                     [#if argument.genericType=="struct"][#-- Init --]
                       [#assign bufferName = ""]
                       [#list argument.argument as argument2]
                         [#if argument2.name==argumentName]
                           [#if argument2.value?? && argument2.value!="__NULL"]
                             [#assign bufferName = argument2.value]
                           [/#if]
                         [/#if]
                       [/#list]
                       [#if bufferName!="" && bufferSize!="" && bufferType!=""]
${bufferType} ${bufferName}[${bufferSize}];
                       [/#if]
                     [/#if]
                   [/#list]
                 [/#if]
               [/#list]
             [/#if]
           [/#if]
         [/#if]
       [/#list]
     [/#if]
   [/#if]
 [/#list]
[/#macro]
источник

КП

Крылатый Пегас in embedded.rs
Mikhail Cheshkov
Или вот

[#macro generateCecRxBuffer configModelList methodName argumentName bufferType bufferSize]
 [#list configModelList as configModel]
   [#if configModel.isMWUsed=="false"]
     [#if configModel.ipName?contains("CEC")]
       [#if configModel.methods??] [#-- if the pin configuration contains a list of LibMethods--]
         [#assign methodList = configModel.methods]
       [#else]
         [#assign methodList = configModel.libMethod]
       [/#if]
       [#list methodList as method]
         [#if method.name==methodName]
           [#if method.status=="OK"]
             [#if method.arguments??]
               [#list method.arguments as fargument]
                 [#if fargument.genericType=="struct"][#-- hcec --]
                   [#list fargument.argument as argument]
                     [#if argument.genericType=="struct"][#-- Init --]
                       [#assign bufferName = ""]
                       [#list argument.argument as argument2]
                         [#if argument2.name==argumentName]
                           [#if argument2.value?? && argument2.value!="__NULL"]
                             [#assign bufferName = argument2.value]
                           [/#if]
                         [/#if]
                       [/#list]
                       [#if bufferName!="" && bufferSize!="" && bufferType!=""]
${bufferType} ${bufferName}[${bufferSize}];
                       [/#if]
                     [/#if]
                   [/#list]
                 [/#if]
               [/#list]
             [/#if]
           [/#if]
         [/#if]
       [/#list]
     [/#if]
   [/#if]
 [/#list]
[/#macro]
Выглядит не хуже сишного препроцессора)
источник

MC

Mikhail Cheshkov in embedded.rs
да лучше, чо уж, я про сам код - кодогенерация типа "вот список аргументов, вот их типы - сгенери прототип", ЗОЧЕМ её писать на особом языке макросов
источник

MC

Mikhail Cheshkov in embedded.rs
чтобы учить ещё один язык?
источник

MC

Mikhail Cheshkov in embedded.rs
или чтобы можно было писать [#if method.arguments??]
источник