Easyelectronics.ru • Просмотр темы - Унифицированная кросс-платформенная библиотека Си

Easyelectronics.ru

Электроника для всех
Текущее время: 18 авг 2018, 11:06

Часовой пояс: UTC + 5 часов



    • JLCPCB - Прототипы 10 PCBs всего за 2$ (100*100mm, 2-layer)
    • Как мы делаем платы, смотрите на YouTube
    • Крупнейшая китайская фабрика прототипов. 300000+ заказчиков и 10000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин комплектующих.

Начать новую тему Ответить на тему  [ Сообщений: 407 ]  На страницу Пред.  1 ... 12, 13, 14, 15, 16, 17  След.
Автор Сообщение
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 04 окт 2017, 18:43 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 4831
Первый в stdint.h второй в stm32xxxx.h
И это редактор не видит хэдеры а не компиль, коли собирается без ошибок.
А редактор может не видеть из-за ваших выкрутасов с плюсами...
Пути к хэдерам в опциях препроцессора прописаны ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 04 окт 2017, 19:05 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
dosikus_2 писал(а):
Первый в stdint.h второй в stm32xxxx.h
И это редактор не видит хэдеры а не компиль, коли собирается без ошибок.
А редактор может не видеть из-за ваших выкрутасов с плюсами...
Пути к хэдерам в опциях препроцессора прописаны ?

путь к системным хедерам я конечно не прописывал, keil сам их находит
путь к своим хедерам прописан в настройках проекта

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

в этом плане это явно глюки
у atmel studio 7 (которая базирована на visual studio) все это работает четко и без вопросов


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 05 окт 2017, 13:07 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
интересно, а можно описать шаблон функции с Сишным naming convention?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 05 окт 2017, 13:22 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 608
axill писал(а):
интересно, а можно описать шаблон функции с Сишным naming convention?

Нет, разве что у какого-то конкретного компилятора можно будет добавить соответствующий атрибут. У gcc я такого не нашел.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 05 окт 2017, 13:40 
Старожил
Аватара пользователя

Зарегистрирован: 23 сен 2012, 20:35
Сообщения: 1911
axill писал(а):
интересно, а можно описать шаблон функции с Сишным naming convention?

Думаю что нет. Хотя бы из тех соображений, что шаблон инстанциируется под конкретные типы параметров шаблона и линкер должен их как-то различать, а значит эта информация должна быть "зашита" в имени которое попадет в объектник.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 05 окт 2017, 13:58 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
жаль
пока только получается что в качестве хандлеров можно применить шаблонирование в прямую только а IAR указав атрибуты для функции или метода класса

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 03:48 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
почему то шаблон работает не так как должен, в методе Init значения psc и arr остаются нулями
не понимаю почему

при этом остальные поля TIM1 в методе Start устанавливаются верно

раскрывается шаблон так:
Код:
typedef Timer1<mcu, 0, 800, 1000> timer1;


Код:
      

      //----------------------------------------------------------------------
      // Timer template class
      //----------------------------------------------------------------------
      template <uint32_t tim_base, IRQn_Type irqn, MCUCommon::APBENR apbenr_n, uint32_t apbenr_mask,
         typename MCU, int freq, uint16_t psc=0, uint16_t arr=0>
      class TimerTmpl : public HandlerData<irqn> {
         protected:
            static constexpr TIM_TypeDef* tim() { return (TIM_TypeDef*)tim_base; }
         public:
         static uint16_t Init(void) {
            if( freq ) {
               // common
               return 0;
            }
            // custom
            tim()->PSC = psc;
            tim()->ARR = arr;

            return MCU::cpu_f / (1 << psc) / arr;
         }
         static void Start(void) {
               // --- allow clocking for TIM16
               *MCUCommon::RegApbEnr(apbenr_n) |= apbenr_mask;
               // --- enable timer with update mode
               tim()->CR1 |= TIM_CR1_CEN | TIM_CR1_URS;
               // --- enable interrupts in update
               tim()->DIER |= TIM_DIER_UIE;
               // --- activate interrupts
               NVIC_EnableIRQ(irqn);
         }
};

   template <typename MCU, int freq, uint16_t psc=0, uint16_t arr=0>
      using Timer1
         = TimerTmpl<TIM1_BASE, TIM1_BRK_UP_TRG_COM_IRQn, MCUCommon::APB2ENR,
         RCC_APB2ENR_TIM1EN, MCU, freq, psc, arr>;



Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 04:15 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 608
axill писал(а):
почему то шаблон работает не так как должен, в методе Init значения psc и arr остаются нулями
не понимаю почему

Потому что эти регистры буферизируются и обновляются при Update Event или путем выставления бита TIM_EGR_UG, шаблон тут не при чем.
И я бы не стал psc и arr запихивать в шаблон, это параметры которые могут меняться в процессе работы, разумнее их передавать в функцию инициализации.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 04:32 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
а я вот RCC перенес ДО настройки PSC и ARR и все заработало
может в этом дело?

пока мне хватает заранее заданных параметров
если будет мало то я сделаю комбинированный вариант и в шаблоне и в функции
по идее все операции на этапе компиляции экономят тучу ресурсов, хотя эта привычка от 8-ми биток, не уверен, что релевантно для стм32

а еще если кто про Кейл знает, почему то он при ctrl-F5 при запуске ротладки теперь останавливается не на первой строке main(), а в одном из методов шаблона GPIO
при том, что там нет точек останова. что за глюк?

п.с. Круто, что железо стм32 так унифицированно, что по основным режимам одним шаблоном я реализовал сразу все таймеры


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 13:02 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 608
axill писал(а):
а я вот RCC перенес ДО настройки PSC и ARR и все заработало
может в этом дело?

Если имеется в виду включение тактирования таймера, которое у тебя в start(), а до него вызывается init(), то конечно. Но это не значит, что PSC и ARR(как минимум PSC) у тебя сразу правильно инитятся, просто ты этого не замечаешь, т.к. это происходит после первого Update. Писал я как-то функцию частотомера, там задержка в 1 сек, PSC был очень большой, но первый раз всегда меряло неправильно, т.к. если самому не сгенерировать Update, то PSC в этот момент будет равен 0.

Цитата:
пока мне хватает заранее заданных параметров
если будет мало то я сделаю комбинированный вариант и в шаблоне и в функции
по идее все операции на этапе компиляции экономят тучу ресурсов, хотя эта привычка от 8-ми биток, не уверен, что релевантно для стм32

Компилятору должно быть все равно, берет он пару констант из параметров шаблона или из аргументов функции. В релизе уж точно, в дебаге нужно проверять.

Цитата:
п.с. Круто, что железо стм32 так унифицированно, что по основным режимам одним шаблоном я реализовал сразу все таймеры

Если просто считать в одном направлении, то все таймеры одинаковые, но если копнуть глубже, то нюансов довольно много. У меня есть ряд шаблонных классов, типа TimBase, TimMasterMode, TimCapCom1(2/3/4/5/6) и т.д., из которых собираются группы однотипных таймеров и даже в таком случае бывают исключения, таймеры у которых какого-то битика не хватает или режима :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 15:04 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1125
Откуда: Германия
axill писал(а):
а еще если кто про Кейл знает, почему то он при ctrl-F5 при запуске ротладки теперь останавливается не на первой строке main(), а в одном из методов шаблона GPIO
при том, что там нет точек останова. что за глюк?

Несовпадение отладочных данных на компе и того, что записано в проце. Сделайте полный ребилд, сотрите полностью проц и перезапишите.
Если поможет, покопайтесь в настройках кайла на предмет того, как прошивается проц. Наверняка где то стоит - не прошивать полностью, или не стирать перед прошивкой. Чтото в этом роде.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 19:20 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
MasterAlexei писал(а):
Несовпадение отладочных данных на компе и того, что записано в проце. Сделайте полный ребилд, сотрите полностью проц и перезапишите.
Если поможет, покопайтесь в настройках кайла на предмет того, как прошивается проц. Наверняка где то стоит - не прошивать полностью, или не стирать перед прошивкой. Чтото в этом роде.


Спасибо за ответ
Ребилд делал, все остальное стоит по умолчанию
А надо делать полное перезаписыванте с предварительным стиранием?

И еще один момент заметил с кейлом. Сейчас простое приложение - blink.
Заметил, что если сделать просто заливку F8, то светодиод не мигает,
А если запустить отладку ctrl-f5 и после этого сразу выйти из отладки - то мигает
С чем связано?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 19:30 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
Reflector, спасибо
Буду иметь в виду, пока проблем с обновлением регистров не заметил и кстати в отладчике значения сейчас отображаются как измененные сразу в отличии от попытки изменить при отключенном тактировании - они в отладчике оставались нулями

Насчет параметров шаблона. В 8ми битрах есть разница на сотню-две байт между вычислениями при компиляции и при исполнении, так как при исполнении 16битная арифметика там это целая подпрограмма. С Stm32f030 разве не так? Или он умеет умножать, но не умеет делить?
Вообще хочу нарисовать логику инициализации таймера по частоте, а не по делителям.
Передаешь желаемую частоту прерываний и psc и arr считаются автоматом
Такую логику для avr8 и stm8 в общем случае голову сломал, но придумать не смог. Там руки связаны, особенно на 8ми битных таймерах. С стм32 все по идее легко, по сути имеем 32битный делитель, можем делить на любое число от 1 до (2^32-1)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 19:41 
Заглядывает иногда

Зарегистрирован: 15 ноя 2015, 12:11
Сообщения: 101
axill писал(а):
а еще если кто про Кейл знает, почему то он при ctrl-F5 при запуске ротладки теперь останавливается не на первой строке main(), а в одном из методов шаблона GPIO
при том, что там нет точек останова. что за глюк?

В C++ конструкторы глобально определённых объектов вызываются до main() - не ваш случай? Мол отладчик находит первую строчку с соответствием в исходном коде и на ней ждёт дальнейших указаний.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 20:11 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1125
Откуда: Германия
axill писал(а):

Спасибо за ответ
Ребилд делал, все остальное стоит по умолчанию
А надо делать полное перезаписыванте с предварительным стиранием?
[/quote]
Желательно попробовать. Флешь как бы по другому и не пишется кроме как полного затирания страниц и потом их записи. Не знаю, как Кайл, но ИАР вроде как всегда затирает все страницы, которые занимает прога. Зеггеровский прошиватор затирает только те страницы, в которых есть несовпадения, потому и ресурс флеша с Зеггером не так сильно тратится.

axill писал(а):
И еще один момент заметил с кейлом. Сейчас простое приложение - blink.
Заметил, что если сделать просто заливку F8, то светодиод не мигает,
А если запустить отладку ctrl-f5 и после этого сразу выйти из отладки - то мигает
С чем связано?

Ну тут надо смотреть, но попробую предположить что сразу после заливки через F8 не происходит ресет проца, а он так и остается висеть в ресете.
А во втором случае, если выйти из отладки, то обычно проц ресетится, и потому прога стартует как обычно.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 20:15 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1125
Откуда: Германия
siarzhuk писал(а):
В C++ конструкторы глобально определённых объектов вызываются до main() - не ваш случай? Мол отладчик находит первую строчку с соответствием в исходном коде и на ней ждёт дальнейших указаний.

Не. В данном случае явный глюк отладчика.
Конструкторы то да, но обычно в настройках отладчика стоит - "после прошивания остановится в начале main и ждать". Либо есть другой пункт - вообще не стартовать прогу. В этом случае должно остановиться прям на первой команде Reset Handler'а. До вызовов вообще чего либо.
А тут именно попахивает несоответствием того, что прошито, с дебажной инфой в объектнике, который загрузили в дебаггер.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 20:42 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 608
axill писал(а):
Насчет параметров шаблона. В 8ми битрах есть разница на сотню-две байт между вычислениями при компиляции и при исполнении, так как при исполнении 16битная арифметика там это целая подпрограмма.

Разница то есть, но я говорил о том, что в обоих случаях при достаточной оптимизации расчет будет выполнен на стадии компиляции. Компилятор любит константы, твои freq, psc и arr являются константами будучи параметрами шаблона, но они также могут быть константами будучи аргументами функции. Если передашь в Init() три числа и эта функция инлайнится, то вместо выражения "cpu_f / (1 << psc) / arr" компилятор подставит константу. Это обычно дело и вовсе не какая-то особая фишка шаблонов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 20:53 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
У меня нет экземпляров класса, так что исполняемый код начинается в main

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

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 21:53 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1125
Откуда: Германия
axill писал(а):
Подозреваю даже, что после сброса питания мигать не будет, надо проверить

Если так, то вы не прошиваете во флешь, а отладчик заливает прогу в SRAM.
Это устанавливается в скрипте линкера.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 07 окт 2017, 22:47 
Только пришел

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 20
axill писал(а):
Такую логику для avr8 и stm8 в общем случае голову сломал, но придумать не смог. Там руки связаны, особенно на 8ми битных таймерах.

я это реализовал так:
Код:
typedef TTimer0_SimpleCycle < TTimerValue < 1 > ::ms > Timer_1ms;

для таймера 0 микроконтроллеров AVR, со статической проверкой возможности задания значения
значение можно задавать в MCycles, KCycles, Cycles, MHz, KHz, Hz, ms, us, ns

я вам выше давал пример как это реализовано у меня
https://ru.files.fm/u/cf4jjthd#/list/
файл uC_cpp.7z


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 08 окт 2017, 00:59 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
MasterAlexei писал(а):
axill писал(а):
Подозреваю даже, что после сброса питания мигать не будет, надо проверить

Если так, то вы не прошиваете во флешь, а отладчик заливает прогу в SRAM.
Это устанавливается в скрипте линкера.

Что за скрипт линкера? Настройки проекта все по умолчанию

сброс питания проверил - все работает, в смысле моргает


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 08 окт 2017, 03:41 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1125
Откуда: Германия
axill писал(а):
сброс питания проверил - все работает, в смысле моргает

Ну значит пишется во флешь.
Еще есть такой интересный финт языка С/С++ - не инициализированные переменные.
Сам на такое напарывался, когда под дебаггером все работало а без дебага - нет. И на оборот.
Так вот - если вы используете переменные, которые вы не инициализировали никак, например
int a;
вместо
int a = 0;
то в первом случае эта перменная может принимать самые разные значения при старте. Дебаг, иногда, сам либо стирает SRAM либо немного портит ее (зависит от дебагера). И получаются разные эффекты.

axill писал(а):
Что за скрипт линкера? Настройки проекта все по умолчанию

Скрипт линкера - это основа основ ембеддед программирования. Рекомендую почитать на эту тему очень внимательно в интернете. Поищите по словам "linker script". И желательно все поумолчательные настройки проверить, и заменить своими, тогда вы будете точно знать, что в вашем проце где лежит, за что отвечает и на что влияет.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 окт 2017, 13:37 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
возможно ли как то описать шаблон для AVR gcc и STM8S IAR так чтобы с его помощью объявлять переменные в eeprom?

попробовал в лоб написать шаблон с полями данных EEMEM для AVR и __eeprom для STM8 - компилятор дает ошибку
из рабочих решений вижу только два:
- обявлять ручками переменные и оборачивать в шаблог только для описания методов доступа
- внутри шаблона на базе статической переменной в памяти самому в рантайме распределять адреса


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 окт 2017, 17:39 
Только пришел

Зарегистрирован: 03 сен 2017, 22:47
Сообщения: 20
Думаю для доступа удобно будет использовать offsetof()
Код:
//----- Адресное пространство EEPROM -------------------------------------------
#pragma pack(push,1)  // выравнивание структуры в 1 байт
typedef struct
{
  uint8_t   no_use;   // защита eeprom для AVR
  uint8_t   param_1;
  uint16_t  param_2;
  int16_t   param_3;
  uint8_t   param_4[PARAM_4_MAX];
} EData;
#pragma pack(pop)     // отмена выравнивания структуры

#define EDATA_READ(M, D)    EData_Read(offsetof(EData, M), sizeof(((EData *)0)->M), D);
#define EDATA_WRITE(M, D)   EData_Write(offsetof(EData, M), sizeof(((EData *)0)->M), D);

// использование
uint8_t   Param_1;

EDATA_READ(param_1, &Param_1); // считываем из eeprom (поле param_1 структуры Edata) в переменную (Param_1)

Все переменные eeprom размещаются в структуре EData
Надо это всё только обернуть в шаблон


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Унифицированная кросс-платформенная библиотека Си
СообщениеДобавлено: 12 окт 2017, 19:08 
Старожил

Зарегистрирован: 20 мар 2013, 11:27
Сообщения: 5077
как сделать сложно мне не интересно
мне интересно как сделать просто
в идеале хотелось бы что то типа (вне зависимости от компилятора):
Код:
EEPROM<int> param1;


но увы не знаю как так сделать
могу пока только так (IAR):

Код:
__eeprom int e_param1;
EEPROM<int> param1((int*)&e_param1);


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 407 ]  На страницу Пред.  1 ... 12, 13, 14, 15, 16, 17  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Кот495


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB