реклама на сайте
подробности

 
 
> Передача глобальной переменной в функцию.
Jenya7
сообщение Nov 8 2016, 14:04
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Есть переменная которая инкрементируется кажую милисекунду.
Код
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);
}
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
Den64
сообщение Nov 8 2016, 14:11
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 584
Регистрация: 22-11-07
Из: Курская область
Пользователь №: 32 571



В первом варианте код красивее. И функция более универсальна, мало ли.
Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 8 2016, 14:25
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



Цитата(Den64 @ Nov 8 2016, 19:11) *
В первом варианте код красивее. И функция более универсальна, мало ли.
Без операционной системы пишите? Если с операционкой то в цикле вызывайте osTaskYield() или TaskYield() или по другому от ОС зависит

это уже написанный код. без операционки. я его причесываю.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Nov 8 2016, 16:02
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(Jenya7 @ Nov 8 2016, 21:04) *
Так

или так

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

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
Jenya7
сообщение Nov 8 2016, 16:31
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 778
Регистрация: 29-03-12
Пользователь №: 71 075



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

да. я понимаю что счетчик переполниться. у меня кстати счетчик Uint64. sm.gif.
надо конечно код подправить. спасибо.
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Nov 8 2016, 17:38
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Jenya7 @ Nov 8 2016, 21:04) *
Вопрос как лучше.

Зависит от того как вы собираетесь дальше использовать этот код.
Первый вариант более строгий и правильный, но чуть медленнее за счет передачи параметров.
Если сделаете проект и забудете - то второй вариант.
Если планируете использовать эту функцию в других проектах, то первый вариант.
И еще десяток таких "если".
Go to the top of the page
 
+Quote Post
AlexandrY
сообщение Nov 8 2016, 17:59
Сообщение #7


Ally
******

Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050



Цитата(HardEgor @ Nov 8 2016, 19:38) *
Зависит от того как вы собираетесь дальше использовать этот код.


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

Go to the top of the page
 
+Quote Post
SSerge
сообщение Nov 8 2016, 18:44
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

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


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Nov 8 2016, 22:01
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



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


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
RuSTA
сообщение Nov 9 2016, 06:01
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 52
Регистрация: 25-10-10
Из: Россия
Пользователь №: 60 410



Как по мне второй код предпочтительней. Но с некоторой оговоркой, я бы ввел проверку на переполнение при условии что время работы прибора более одного часа. Кроме этого, на сколько целесообразно писать inline функцию, если отмеряется мс задержки, то передача аргументов в стек ничтожна по сравнению с 1 мс. Еще помимо этого, странно как то: функция называется delay_ms, а аргумент us. Какой то диссонанс.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Nov 9 2016, 06:18
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Кстати, вместо asm("NOP") надо использовать интринсик-функцию __nop().
Go to the top of the page
 
+Quote Post
smalcom
сообщение Nov 9 2016, 06:28
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 292
Регистрация: 26-06-07
Пользователь №: 28 718



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

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


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

зы. ПМСМ первый вариант бессмысленный, т.к. переменная глобальная.
Go to the top of the page
 
+Quote Post
Valentine Logino...
сообщение Nov 9 2016, 06:35
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 78
Регистрация: 7-04-10
Из: Пушкино
Пользователь №: 56 462



Лучше всего будет, если вы реализуете <sys/time.h> под свой камень и будете этим пользоваться.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 12th August 2025 - 00:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01512 секунд с 7
ELECTRONIX ©2004-2016