Jump to content

    

demiurg_spb

Свой
  • Content Count

    2747
  • Joined

  • Last visited

Community Reputation

0 Обычный

About demiurg_spb

  • Rank
    неотягощённый злом
  • Birthday 01/08/1980

Контакты

  • Сайт
    http://www.automatix.ru
  • ICQ
    486167559

Информация

  • Город
    Санкт-Петербург
  1. Опять клеим #defines

    #define _BUILD_D ((u32)((__DATE__[4] == ' ')?(__DATE__[5] - '0'):((__DATE__[4] - '0')*10 + (__DATE__[5] - '0')))) #define BUILD_D _BUILD_D так должно сработать. нужен ещё один уровень вложенности дефайна чтобы всё развернулось корректно.
  2. Проблема ассемблером для 1986ВЕ92

    Чем раньше перейдёте с АСМ на Си тем крепче будет ваше здоровье. Не шутка.
  3. Инлайновая функция

    Тут ещё extern inline не обсосали))) Помню что в стандарте это описывается. С ходу нашёл лишь https://www.ibm.com/support/knowledgecenter...ine_linkage.htm http://m68hc11.serveftp.org/inline-1.php
  4. Инлайновая функция

    То, то. ИМХО внутри _Pragma(...) можно всё что угодно написать (даже "inline = forced") и задефайнить...
  5. Инлайновая функция

    Немного погуглив нашёл _Pragma(...) #ifdef IAR #define NO_OPT _Pragma ("optimize=none") #endif NO_OPT void some_func(void) { … }
  6. Инлайновая функция

    А в IAR разве нет атрибутов наподобие gcc и keil? У меня написан compiler.h в котором все нюансы компиляторов запрятаны. Типа #if defined(__GNUC__) # define __is_always_inline __inline__ __attribute__((__always_inline__)) #endif А пользовательский код никаких специфических вещей компиляторов не использует - только свою прослойку. static __is_always_inline void foo(void) { // do something } ИМХО прагмы в коде последнее дело...
  7. Инлайновая функция

    файл .h static inline uint32_t SYSTIME_GetSystemTime(void) { //do something } и всё
  8. Функция sprintf

    Может банальное переполнение буфера? HINT: Попробуйте на snprintf заменить и в будущем только её и использовать...
  9. Цитата(Forger @ May 7 2018, 18:05) Вангую, что останется самая простая и примитивная из них.Ага))) и звать её ssize_t подробнее тут
  10. Цитата(Сергей Борщ @ May 2 2018, 22:55) А решение "в лоб" не работает?Телепатирую))) Видимо нет, т.к. хочется видеть разный вывод: size before: XXX size after: XXX
  11. *char to long

    Посмотрите файлик modbus-data.c из библиотеки libmodbus.
  12. Цитата(Trashy_2 @ Jan 22 2018, 16:39) В общем, как заставить работать первый вариант? я полагаю так: Код#define _svComandLine(vROW_Z) Serial2.print("\e["#vROW_Z";1H"); #define svComandLine(vROW_Z) _svComandLine(vROW_Z)
  13. Может Вам пригодится... Для многих АВРок есть возможность тоглить (инвертировать) состояние GPIO путём записи в регистр PINx. Пример инверсии нулевого и седьмого бита в порту Б: КодPINB = (1<<7)|(1<<0); Вот список моделей для которых это можно CODE #if defined(__AVR_AT90PWM1__) \ || defined(__AVR_AT90PWM2__) \ || defined(__AVR_AT90PWM2B__) \ || defined(__AVR_AT90PWM3__) \ || defined(__AVR_AT90PWM3B__) \ || defined(__AVR_AT90PWM216__) \ || defined(__AVR_AT90PWM316__) \ || defined(__AVR_AT90PWM81__) \ || defined(__AVR_AT90USB82__) \ || defined(__AVR_AT90USB162__) \ || defined(__AVR_ATmega8U2__) \ || defined(__AVR_ATmega16U2__) \ || defined(__AVR_ATmega32U2__) \ || defined(__AVR_ATmega16U4__) \ || defined(__AVR_ATmega32U4__) \ || defined(__AVR_ATmega32U6__) \ || defined(__AVR_AT90USB646__) \ || defined(__AVR_AT90USB647__) \ || defined(__AVR_AT90USB1286__) \ || defined(__AVR_AT90USB1287__) \ || defined(__AVR_AT90CAN32__) \ || defined(__AVR_AT90CAN64__) \ || defined(__AVR_AT90CAN128__) \ || defined(__AVR_ATmega16M1__) \ || defined(__AVR_ATmega32M1__) \ || defined(__AVR_ATmega64M1__) \ || defined(__AVR_ATmega32C1__) \ || defined(__AVR_ATmega64C1__) \ || defined(__AVR_ATmega48__) || defined(__AVR_ATmega48A__) \ || defined(__AVR_ATmega88__) || defined(__AVR_ATmega88A__) \ || defined(__AVR_ATmega168__) || defined(__AVR_ATmega168A__) \ || defined(__AVR_ATmega48P__) || defined(__AVR_ATmega48PA__) \ || defined(__AVR_ATmega88P__) || defined(__AVR_ATmega88PA__) \ || defined(__AVR_ATmega168P__) || defined(__AVR_ATmega168PA__) \ || defined(__AVR_ATmega328__) \ || defined(__AVR_ATmega328P__) \ || defined(__AVR_ATmega640__) \ || defined(__AVR_ATmega1280__) \ || defined(__AVR_ATmega1281__) \ || defined(__AVR_ATmega2560__) \ || defined(__AVR_ATmega2561__) \ || defined(__AVR_ATmega164A__) \ || defined(__AVR_ATmega164P__) || defined(__AVR_ATmega164PA__) \ || defined(__AVR_ATmega324A__) \ || defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324PA__) \ || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) \ || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) \ || defined(__AVR_ATmega1284P__) \ || defined(__AVR_ATmega165__) || defined(__AVR_ATmega165A__) \ || defined(__AVR_ATmega165P__) || defined(__AVR_ATmega165PA__) \ || defined(__AVR_ATmega325__) || defined(__AVR_ATmega325A__) \ || defined(__AVR_ATmega325P__) \ || defined(__AVR_ATmega3250__) \ || defined(__AVR_ATmega3250P__) \ || defined(__AVR_ATmega645__) || defined(__AVR_ATmega645A__) \ || defined(__AVR_ATmega645P__) \ || defined(__AVR_ATmega6450__) || defined(__AVR_ATmega6450A__) \ || defined(__AVR_ATmega6450P__) \ || defined(__AVR_ATmega169__) || defined(__AVR_ATmega169A__) \ || defined(__AVR_ATmega169P__) || defined(__AVR_ATmega169PA__) \ || defined(__AVR_ATmega329__) || defined(__AVR_ATmega329A__) \ || defined(__AVR_ATmega329P__) || defined(__AVR_ATmega329PA__) \ || defined(__AVR_ATmega3290__) \ || defined(__AVR_ATmega3290P__) \ || defined(__AVR_ATmega649__) || defined(__AVR_ATmega649A__) \ || defined(__AVR_ATmega6490__) || defined(__AVR_ATmega6490A__) \ || defined(__AVR_ATmega6490P__) \ || defined(__AVR_ATmega649P__) \ || defined(__AVR_ATmega406__) \ || defined(__AVR_ATmega8HVA__) \ || defined(__AVR_ATmega16HVA__) \ || defined(__AVR_ATmega16HVA2__) \ || defined(__AVR_ATmega16HVB__) \ || defined(__AVR_ATmega32HVB__) \ || defined(__AVR_ATmega64HVE__) \ || defined(__AVR_ATtiny261__) || defined(__AVR_ATtiny261A__) \ || defined(__AVR_ATtiny461__) || defined(__AVR_ATtiny461A__) \ || defined(__AVR_ATtiny861__) || defined(__AVR_ATtiny861A__) \ || defined(__AVR_ATtiny2313__) || defined(__AVR_ATtiny2313A__) \ || defined(__AVR_ATtiny4313__) \ || defined(__AVR_ATtiny13__) || defined(__AVR_ATtiny13A__) \ || defined(__AVR_ATtiny25__) \ || defined(__AVR_ATtiny45__) \ || defined(__AVR_ATtiny85__) \ || defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny24A__) \ || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny44A__) \ || defined(__AVR_ATtiny84__) \ || defined(__AVR_ATtiny43U__) \ || defined(__AVR_ATtiny48__) || defined(__AVR_ATtiny88__) \ || defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__) # define PIN_TOGGLE_BY_PIN_WRITE 1 #else # define PIN_TOGGLE_BY_PIN_WRITE 0 #endif
  14. Там два разных примера и смысл там, насколько я понимаю, такой: Первый пример - традиционный с условным переходом, где каждая ветка имеет свои уникальные инструкции, помимо общих инструкций проверки условия и условного перехода. Второй пример - линейный с использованием условного выполнения на стадии каждой инструкции и если инструкция не нужна, она трактуется как NOP и выполняется за 1 такт - чудес не бывает))). Второй лучше тем, что линейный и не требует перезагрузки конвейера, как в случае с переходом, а так же не тратит время на сам переход. Первый лучше тем, что работает на всех ARM Cortem-M, включая M0.