jenya7 0 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба Есть переменная которая инкрементируется кажую милисекунду. globalSysTime++; Вопрос как лучше. Так static inline Delay_ms(Uint32 * start_val, Uint32 del_us) { Uint32 del = *start_val + del_us; do{ asm(" NOP"); }while(del > *start_val); } или так static inline Delay_ms(Uint32 del_us) { Uint32 del = globalSysTime + del_us; do{ asm(" NOP"); }while(del > globalSysTime); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Den64 0 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба В первом варианте код красивее. И функция более универсальна, мало ли. Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба В первом варианте код красивее. И функция более универсальна, мало ли. Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит это уже написанный код. без операционки. я его причесываю. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба Так или так Оба варианта на 49-й день сработают неправильно. Посмотрите обсуждение проблемы тут: https://electronix.ru/forum/index.php?showt...118351&st=0 А переменную globalSysTime нужно всенепременно описать как volatile, не то компилятор "лишние" обращения к ней выбросит при оптимизации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба Оба варианта на 49-й день сработают неправильно. Посмотрите обсуждение проблемы тут: https://electronix.ru/forum/index.php?showt...118351&st=0 да. я понимаю что счетчик переполниться. у меня кстати счетчик Uint64. :). надо конечно код подправить. спасибо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 63 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба Вопрос как лучше. Зависит от того как вы собираетесь дальше использовать этот код. Первый вариант более строгий и правильный, но чуть медленнее за счет передачи параметров. Если сделаете проект и забудете - то второй вариант. Если планируете использовать эту функцию в других проектах, то первый вариант. И еще десяток таких "если". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба Зависит от того как вы собираетесь дальше использовать этот код. Второй вариант лучше при любых раскладах. И чем больше опыта тем он предпочтительней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 4 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба да. я понимаю что счетчик переполниться. у меня кстати счетчик Uint64. :). надо конечно код подправить. спасибо. О переполнении можно не беспокоиться, но тут Вас подстерегает другая опасность: теперь нужно обеспечить атомарное чтение счетчика. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 8 ноября, 2016 Опубликовано 8 ноября, 2016 · Жалоба И "NOP" ни нафиг не нужно использовать в любом варианте. Для управления оптимизацией должны использоваться явные методы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RuSTA 0 9 ноября, 2016 Опубликовано 9 ноября, 2016 · Жалоба Как по мне второй код предпочтительней. Но с некоторой оговоркой, я бы ввел проверку на переполнение при условии что время работы прибора более одного часа. Кроме этого, на сколько целесообразно писать inline функцию, если отмеряется мс задержки, то передача аргументов в стек ничтожна по сравнению с 1 мс. Еще помимо этого, странно как то: функция называется delay_ms, а аргумент us. Какой то диссонанс. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 9 ноября, 2016 Опубликовано 9 ноября, 2016 · Жалоба Кстати, вместо asm("NOP") надо использовать интринсик-функцию __nop(). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
smalcom 0 9 ноября, 2016 Опубликовано 9 ноября, 2016 · Жалоба Второй вариант лучше. Покажу свой, пхожий вариант void Delay_ms(const uint8_t pDelay) { for(uint8_t i = 0; i < pDelay; i++) Delay_1ms(); } void Delay_1ms() { uint32_t startval = TIM_GetCounter(HWCONF_DELTIM_TIM); do {} while((TIM_GetCounter(HWCONF_DELTIM_TIM) - startval) <= 1); } в случае ТС вместо значения счётчика использовать переменную. зы. ПМСМ первый вариант бессмысленный, т.к. переменная глобальная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
becopt 0 9 ноября, 2016 Опубликовано 9 ноября, 2016 · Жалоба Лучше всего будет, если вы реализуете <sys/time.h> под свой камень и будете этим пользоваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться