Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача глобальной переменной в функцию.
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Jenya7
Есть переменная которая инкрементируется кажую милисекунду.
Код
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
В первом варианте код красивее. И функция более универсальна, мало ли.
Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит
Jenya7
Цитата(Den64 @ Nov 8 2016, 19:11) *
В первом варианте код красивее. И функция более универсальна, мало ли.
Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит

это уже написанный код. без операционки. я его причесываю.
SSerge
Цитата(Jenya7 @ Nov 8 2016, 21:04) *
Так

или так

Оба варианта на 49-й день сработают неправильно.
Посмотрите обсуждение проблемы тут: https://electronix.ru/forum/index.php?showt...118351&st=0

А переменную globalSysTime нужно всенепременно описать как volatile, не то компилятор "лишние" обращения к ней выбросит при оптимизации.
Jenya7
Цитата(SSerge @ Nov 8 2016, 21:02) *
Оба варианта на 49-й день сработают неправильно.
Посмотрите обсуждение проблемы тут: https://electronix.ru/forum/index.php?showt...118351&st=0

да. я понимаю что счетчик переполниться. у меня кстати счетчик Uint64. sm.gif.
надо конечно код подправить. спасибо.
HardEgor
Цитата(Jenya7 @ Nov 8 2016, 21:04) *
Вопрос как лучше.

Зависит от того как вы собираетесь дальше использовать этот код.
Первый вариант более строгий и правильный, но чуть медленнее за счет передачи параметров.
Если сделаете проект и забудете - то второй вариант.
Если планируете использовать эту функцию в других проектах, то первый вариант.
И еще десяток таких "если".
AlexandrY
Цитата(HardEgor @ Nov 8 2016, 19:38) *
Зависит от того как вы собираетесь дальше использовать этот код.


Второй вариант лучше при любых раскладах.
И чем больше опыта тем он предпочтительней.

SSerge
Цитата(Jenya7 @ Nov 8 2016, 23:31) *
да. я понимаю что счетчик переполниться. у меня кстати счетчик Uint64. sm.gif.
надо конечно код подправить. спасибо.

О переполнении можно не беспокоиться, но тут Вас подстерегает другая опасность: теперь нужно обеспечить атомарное чтение счетчика.
zltigo
И "NOP" ни нафиг не нужно использовать в любом варианте. Для управления оптимизацией должны использоваться явные методы.
RuSTA
Как по мне второй код предпочтительней. Но с некоторой оговоркой, я бы ввел проверку на переполнение при условии что время работы прибора более одного часа. Кроме этого, на сколько целесообразно писать inline функцию, если отмеряется мс задержки, то передача аргументов в стек ничтожна по сравнению с 1 мс. Еще помимо этого, странно как то: функция называется delay_ms, а аргумент us. Какой то диссонанс.
ViKo
Кстати, вместо asm("NOP") надо использовать интринсик-функцию __nop().
smalcom
Второй вариант лучше. Покажу свой, пхожий вариант

Код
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);
}


в случае ТС вместо значения счётчика использовать переменную.

зы. ПМСМ первый вариант бессмысленный, т.к. переменная глобальная.
Valentine Loginov
Лучше всего будет, если вы реализуете <sys/time.h> под свой камень и будете этим пользоваться.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.