Перейти к содержанию
    

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так

 

или так

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вопрос как лучше.

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, вместо asm("NOP") надо использовать интринсик-функцию __nop().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Лучше всего будет, если вы реализуете <sys/time.h> под свой камень и будете этим пользоваться.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...