Jump to content

    
Sign in to follow this  
jenya7

Передача глобальной переменной в функцию.

Recommended Posts

Есть переменная которая инкрементируется кажую милисекунду.

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);
}

Share this post


Link to post
Share on other sites

В первом варианте код красивее. И функция более универсальна, мало ли.

Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит

Share this post


Link to post
Share on other sites
В первом варианте код красивее. И функция более универсальна, мало ли.

Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит

это уже написанный код. без операционки. я его причесываю.

Share this post


Link to post
Share on other sites
Так

 

или так

Оба варианта на 49-й день сработают неправильно.

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

 

А переменную globalSysTime нужно всенепременно описать как volatile, не то компилятор "лишние" обращения к ней выбросит при оптимизации.

Share this post


Link to post
Share on other sites
Оба варианта на 49-й день сработают неправильно.

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

да. я понимаю что счетчик переполниться. у меня кстати счетчик Uint64. :).

надо конечно код подправить. спасибо.

Share this post


Link to post
Share on other sites
Вопрос как лучше.

Зависит от того как вы собираетесь дальше использовать этот код.

Первый вариант более строгий и правильный, но чуть медленнее за счет передачи параметров.

Если сделаете проект и забудете - то второй вариант.

Если планируете использовать эту функцию в других проектах, то первый вариант.

И еще десяток таких "если".

Share this post


Link to post
Share on other sites
Зависит от того как вы собираетесь дальше использовать этот код.

 

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

И чем больше опыта тем он предпочтительней.

 

 

Share this post


Link to post
Share on other sites
да. я понимаю что счетчик переполниться. у меня кстати счетчик Uint64. :).

надо конечно код подправить. спасибо.

О переполнении можно не беспокоиться, но тут Вас подстерегает другая опасность: теперь нужно обеспечить атомарное чтение счетчика.

 

Share this post


Link to post
Share on other sites

И "NOP" ни нафиг не нужно использовать в любом варианте. Для управления оптимизацией должны использоваться явные методы.

 

Share this post


Link to post
Share on other sites

Как по мне второй код предпочтительней. Но с некоторой оговоркой, я бы ввел проверку на переполнение при условии что время работы прибора более одного часа. Кроме этого, на сколько целесообразно писать inline функцию, если отмеряется мс задержки, то передача аргументов в стек ничтожна по сравнению с 1 мс. Еще помимо этого, странно как то: функция называется delay_ms, а аргумент us. Какой то диссонанс.

Share this post


Link to post
Share on other sites

Второй вариант лучше. Покажу свой, пхожий вариант

 

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);
}

 

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

 

зы. ПМСМ первый вариант бессмысленный, т.к. переменная глобальная.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this