Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

расчетно порушить её можно специально записав delay_ms(17000); но так писать и не надо - для того и делал, - надо Delay(1,17000,delayx,delayt); и всё будет ок (только для таких длинных интервалов delayt придется делать лонг...), правда если delay будет лонг - то и delay_ms(17000); её не вышибет...
другой вариант для больших интервалов использовать предделитель для вызова этой функции (счетчик пойдёт медленнее).
на встречный вопрос об ожидании внешнего события - в цикл ожидания надо вставить Delay(1,0,delayx,delayt); и всё будет ОК
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Берите нормальною ОС, типа FreeRTOS. Возможностей гораздо больше.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

можно было бы вообще счетчик останавливать, тогда можно пихать код любой длительности, но это доппроверки -> удлинение кода, а т.к. я пытаюсь его ужать - то лучше про этот нюанс просто буду помнить.
___________________
а нормальная ОС в тини влезет?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Каждый сам выбирает способ выстрелить себе в ногу... и если уж кто решил - бесполезно отговаривать.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346671#p3346671"]нет, только выход наружу (вместо брейк) и только в пределах функции[/uquote]

Если все тек, как Вы описываете ниже используйте return вместо goto. И никаких меток :-)
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

а если этот код не будет выделен в функцию?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1590
Зарегистрирован: Вс июн 24, 2012 16:07:00
Откуда: Лен.Обл.

Сообщение da-nie »

А вы его выделите. ;)
И день и ночь в пути...
Мои программки: https://github.com/da-nie
Мои публикации: https://habr.com/ru/users/da-nie/posts/
Мои видео: https://www.youtube.com/channel/UCUroi3 ... 52g/videos
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

бывает, за пару слов борорься приходится а вы мне предлагаете потерять ещё немного флеша на запись, памяти на стек и времени на переход? а что я получаю взамен?
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346922#p3346922"]бывает, за пару слов борорься приходится а вы мне предлагаете потерять ещё немного флеша на запись, памяти на стек и времени на переход? а что я получаю взамен?[/uquote]

Компилятор все заоптимизирует. Не будет никаких вызовов.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346922#p3346922"]бывает, за пару слов борорься приходится а вы мне предлагаете потерять ещё немного флеша на запись, памяти на стек и времени на переход? а что я получаю взамен?[/uquote]вы так и не объяснили, зачем вам строго нормированное по времени исполнения дробление кода. поэтому объяснить вам преимущества иного подхода - невозможно. тем более, что вы не особо прислушиваетесь. ну и соответственно, желание советовать тоже тает.

ковыряться в ваших макросах уже никто не хочет, да и ответов на ваши вопросы, по-моему, уже три страницы нет. прогноз каков? останетесь вы со своими проблемами в гордом одиночестве, да и все. мир не перевернется, никто не пострадает, никто и не заметит. всем, и вам тоже, будет наплевать на всё.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Сообщения: 291
Зарегистрирован: Чт ноя 06, 2014 13:09:06

Сообщение viiv »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346884#p3346884"]а если этот код не будет выделен в функцию?[/uquote]

Опять же недопонимание. Как я понял, Вы хотите написать функцию, которая будет выполняться последовательно частями. Это все надо для того, чтобы где-то ее (эту функцию) вызвать, не заботясь какая часть будет выполняться. Это так? Тогда как может быть, что "этот код не будет выделен в функцию"?
Модератор
Аватара пользователя
Сообщения: 4618
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Такой ощущение, что человек начал разговор не из-за помощи или совета, а что бы что-то кому-то доказать.
Советовать тоже уже нет никакого желания...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

viiv писал(а):Это так?
ну как... есть одна-единственная функция в программе, которая содержит в себе тот самый крутой автомат состояний, выполняющий ВСЁ. и эта единственная функция - обработчик прерывания, поэтому выходить из неё особо и не надо - некуда, кроме как снова в себя...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

[uquote="viiv",url="/forum/viewtopic.php?p=3346939#p3346939"]Компилятор все заоптимизирует. Не будет никаких вызовов.[/uquote] точно! заоптимизировал!

Добавлено after 4 minutes 11 seconds:
где можно почитать про возможности компилятора, про то как с ним более конструктивно взаимодействовать?
--------------------------------
ПС OSA скачал - начал изучать, но свой велосипед допилю - дело принципа!
Последний раз редактировалось Ivanoff-iv Чт апр 05, 2018 12:21:00, всего редактировалось 1 раз.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ivanoff-iv писал(а):про то как с ним более конструктивно взаимодействовать?
не надо с ним взаимодействовать, потому как его пути неисповедимы. лучше сразу писать прилично, и радоваться.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 7083
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

доделаю сам, буду пользоваться сам, а с вами не поделюсь, злые вы 8) :)) :)) :))
пока задача - изучение языка, я знаю, что, уже для всего написаны готовые библиотеки, но, хочу чтото своё сделать и посмотреть насколько "коричневым" будет этот велосипед...

Добавлено after 1 minute 55 seconds:
пока я добился ощутимого сокращения потребления тока... и, вроде, ничего не глючит

Добавлено after 2 minutes 3 seconds:
пока смирюсь с отсутствием автонумерации и попробую побольше всего втолкать, посмотрю, насколько удобно вышло, а потом всё это на РТОС повторю

Добавлено after 1 minute 39 seconds:
на этот вопрос для себя я нашел консенсус, можете больше не отвечать.

Добавлено after 33 minutes 12 seconds:
viiv, перепроверил - с упаковкой в функцию получается на одно слово тяжелей, чем без упаковки.

Добавлено after 14 minutes 49 seconds:
________________________
всё, оценил масштаб - буду переписывать на функциях, а то на дефайнах слишком жирно выходит, спасибо за идеи.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346741#p3346741"]а нормальная ОС в тини влезет?[/uquote]Зачем себя так ограничивать? Можно взять МК скажем с 128 КБ флеша и 20 КБ ОЗУ. Запустить на нем ОСь и пусть крутятся на ней скажем 10 задач. :)
Нормальная ОСь это не только планировщик задач, но и средства для доступа к общим ресурсам, очереди, программные таймеры и т. д. :)
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3346671#p3346671"]сейчас код выглядит так (пример использования)[/uquote]
Это напоминает Протопотоки (protothreads),поздновато увидел вашу дискуссию, так что последний страницы пришлось прочитать по диагонали, так что извиняйте если такое уже поднималось.
Подключал несколько DS1821, в таймере, получилось как-то так.
Спойлер

Код: Выделить всё


#define Setdelay_us(Value)	TIM1->PSC=40-1;TIM1->ARR = Value-1;TIM1->CNT = 0; PT_YIELD(pt);
#define Setdelay_ms(Value)	TIM1->PSC=39800-1;TIM1->ARR = Value-1;TIM1->CNT = 0; PT_YIELD(pt);

PT_THREAD(DS1821_thread(struct pt *pt,unsigned char id)){
static unsigned char ReadData;
static unsigned char StatusDS1821=SENSOR_INIT_VALIDATION_SUCCESS;
static unsigned char Status;
unsigned char i;
unsigned char flag_exit;
//--------------------------------------------------------------------------------------------------
PT_BEGIN(pt);
//--------------------------------------------------------------------------------------------------
	PT_INIT(&Point_Ds1821_TransmitData);
	PT_INIT(&Point_Ds1821_ReadData);
	PT_INIT(&Point_Ds1821_ResetData);
	//---------------------Инициализация выводов термодатчиков------------------------------------------
	InitPinDS1821_HOT();
	//-------------------------------Предварительная инициализация--------------------------------------
	DS1821_ZT_OFF
	DS1821_OFF
	DS1821_HOT_IN
	DS1821_UL_IN
	DS1821_COLD_IN
	DS1821_COLLING_IN
	Setdelay_ms(2);
	//----------------------------------------------------------------------------------------------
	DS1821_ON
	DS1821_W
	//--------------------------------Порты на выход------------------------------------------------
	DS1821_HOT_OUT
	DS1821_COLD_OUT
	DS1821_UL_OUT
	DS1821_COLLING_OUT
	//------------------------Записать в порт логическую единицу------------------------------------
	DS1821_HOT_ON
	DS1821_COLD_ON
	DS1821_UL_ON
	DS1821_COLLING_ON
	//----------------------------------------------------------------------------------------------
	Setdelay_ms(2);
	DS1821_ZT_ON
	//-----------------------Обработчик аварий термодатчиков----------------------------------------
	if(StatusDS1821==SENSOR_INIT_VALIDATION_FAIL){
		//1) Проверяем какой термодатчик привёл к аварии

		//-------------Находим термодатчик который выдал аварию---------------------
		for(i=0;i<4;i++){
			if(TypeErrorTemp[i]>1){
				CounterErrorTemp[i]=CounterErrorTemp[i]+1;
				if(CounterErrorTemp[i]>=3){
					TypeErrorTemp[i]=TYPE_T_BLOCK;
					Send_MSG(MSG_EXIST_ERROR);
				}
			//HandlerError(CurrentTemp);
			}
		}
	}
	//------------------Задержка на включение термодатчика------------------------------------------
	Setdelay_ms(2000);
	//--------------------------Reset---------------------------------------------------------------
	PT_WAIT_THREAD(pt,ds1821_Reset_thread(&Point_Ds1821_ResetData,&StatusDS1821));
	//-------------------write 0x0C-------------------------------------------------------------
	PT_WAIT_THREAD(pt,ds1821_transmit_data_thread(&Point_Ds1821_TransmitData,0x0C));
	//-------------------write 0x00-------------------------------------------------------------
	PT_WAIT_THREAD(pt,ds1821_transmit_data_thread(&Point_Ds1821_TransmitData,0x00));
	//----------------------------------------------------------------------------------------------
	//-----------------------------Главный цикл работы термодатчика---------------------------------
	//----------------------------------------------------------------------------------------------
	while(1){
		//-------------------------------------------------------------------------------------
		PT_WAIT_THREAD(pt,ds1821_Reset_thread(&Point_Ds1821_ResetData,&StatusDS1821));
		//-------------------Отправка команды на преобразование температуры-------------------------
		PT_WAIT_THREAD(pt,ds1821_transmit_data_thread(&Point_Ds1821_TransmitData,0xEE));
		//-------------------Выдержка времени преобразования температуры----------------------------
		Setdelay_ms(DS18B2_PERIOD_POLLING_AND_CONVERSIONS_T);
		//--------------------------------RESET-----------------------------------------------------
		PT_WAIT_THREAD(pt,ds1821_Reset_thread(&Point_Ds1821_ResetData,&StatusDS1821));
		//-------------Отправка команды на чтение температуры---------------------------------------
		PT_WAIT_THREAD(pt,ds1821_transmit_data_thread(&Point_Ds1821_TransmitData,0xAA));
		//-----------------------------Чтение температуры-------------------------------------------
		PT_WAIT_THREAD(pt,ds1821_read_data_thread(&Point_Ds1821_ReadData,CurrentTemp));
		//------------------------------------------------------------------------------------------
		for(i=0;i<4;i++){
			if(TypeErrorTemp[i]==TYPE_T_BLOCK){
				//Термодатчик заблокирован
			}else{
				SetStatusTemp(CurrentTemp[i],i);// Если термодатчик не заблокирован то выставляем статус
			}
		}
		SendBroadcastMessages(TEMP_COMPLEATED);	//Для нескольких процессов в главном цикле.
		//------------------------------------------------------------------------------------------
		if(StatusDS1821==SENSOR_INIT_VALIDATION_FAIL){
				//-------------Находим термодатчик который выдал аварию---------------------
				for(i=0;i<4;i++){
					if(TypeErrorTemp[i]>=1){	//какая то авария КЗ на ноль или 1
                        CurrentStatusTemp[i]=STATUS_T_SHORT_CIRCUIT;
						if(TypeErrorTemp[i]==TYPE_T_BLOCK){
							//Термодатчик заблокирован можно продолжать работу
						}else{
							flag_exit=1;
						}
					}else{
						CounterErrorTemp[i]=0;	//Перезапустить счетчик аварий, так как чтение в норме.
					}
				}
				//-----дожидаемся установления всех статусов--------------
				if(flag_exit==1){
					PT_EXIT(pt);
				}
        }
		//------------------------------------------------------------------------------------------
		PT_END_YIELD(pt);
	}
//--------------------------------------------------------------------------------------------------
PT_END(pt);
}


PT_THREAD(ds1821_Reset_thread(struct pt *pt,unsigned char *ReturnValue)){
static unsigned short int Ack[2];
PT_BEGIN(pt);
	//---------------------------------------------
	//---------------------------------------------
	//---------------------------------------------
	DS1821_ZT_OFF
	//---------Порт на выход-----------------------
	DS1821_HOT_OUT
	DS1821_COLD_OUT
	DS1821_UL_OUT
	DS1821_COLLING_OUT
	//-----------Запись ноль в порт----------------
	DS1821_HOT_OFF;
	DS1821_COLD_OFF
	DS1821_UL_OFF
	DS1821_COLLING_OFF
	//---------- региста на запись------------
	DS1821_W
	DS1821_ZT_ON
	Setdelay_us(600);
	//---------------------------------------------
	DS1821_R
	//---------- на вход----------------------
	DS1821_HOT_IN
	DS1821_UL_IN
    DS1821_COLD_IN
    DS1821_COLLING_IN
	//---------------------------------------------
	Setdelay_us(80);
	//---------------------------------------------
	Ack[0]=DS1821_READ_ALL;
	//---------------------------------------------
	Setdelay_us(300);
	//---------------------------------------------
	Ack[1]=DS1821_READ_ALL;
	//---------------------------------------------
	//---------------------------------------------
	//-------тут надо сделать проверку всех--------
	//---------------------------------------------
	//--------Если хоть 1 не ответил то выдаём команду  на зависание
	if((Ack[0] == 0)&&(Ack[1] == (DS1821_HOT_PIN|DS1821_COLD_PIN|DS1821_COLLING_PIN|DS1821_UL_PIN))){
		*ReturnValue=SENSOR_INIT_VALIDATION_SUCCESS;
	}else{
		//------------------------------------------------------------------------------------------
		*ReturnValue=SENSOR_INIT_VALIDATION_SUCCESS; //Если не кто не изменил статус значит аварии заблокированны
		//------------------------------------------------------------------------------------------
		//-------------------- какой термодатчик в аварии---------------------------------
		//------------------------------------------------------------------------------------------
		//------------------------Термодатчик горячий-----------------------------------------------
		if((Ack[0]&DS1821_HOT_PIN)==(Ack[1]&DS1821_HOT_PIN)){
			if(TypeErrorTemp[T_HOT]!=TYPE_T_BLOCK){	//Если авария не заблокирована
				Send_MSG(MSG_EXIST_ERROR);
				*ReturnValue=SENSOR_INIT_VALIDATION_FAIL;
				if(Stm32BitIsSet(Ack[0],DS1821_HOT_PIN)){
					TypeErrorTemp[T_HOT]=TYPE_T_SHORT_CIRCUIT_1; //Замыкание 1
				}else{
					TypeErrorTemp[T_HOT]=TYPE_T_SHORT_CIRCUIT_0; //Замыкание 0
				}
			}
		}else{
            TypeErrorTemp[T_HOT]=STATUS_T_NORM; //Сбрассываем предыдуший флаг аварии
        }
		//------------------------Термодатчик Холодный-----------------------------------------------
		if((Ack[0]&DS1821_COLD_PIN)==(Ack[1]&DS1821_COLD_PIN)){
			if(TypeErrorTemp[T_COLD]!=TYPE_T_BLOCK){	//Если авария не заблокирована
				Send_MSG(MSG_EXIST_ERROR);
				*ReturnValue=SENSOR_INIT_VALIDATION_FAIL;
				if(Stm32BitIsSet(Ack[0],DS1821_COLD_PIN)){
					TypeErrorTemp[T_COLD]=TYPE_T_SHORT_CIRCUIT_1; //Замыкание 1
				}else{
					TypeErrorTemp[T_COLD]=TYPE_T_SHORT_CIRCUIT_0; //Замыкание 0
				}
			}
		}else{
            TypeErrorTemp[T_COLD]=STATUS_T_NORM; //Сбрассываем предыдуший флаг аварии
        }
		//--------------------------------------------------------
		if((Ack[0]&DS1821_COLLING_PIN)==(Ack[1]&DS1821_COLLING_PIN)){
			if(TypeErrorTemp[T_COLLING]!=TYPE_T_BLOCK){	//Если авария не заблокирована
				Send_MSG(MSG_EXIST_ERROR);
				*ReturnValue=SENSOR_INIT_VALIDATION_FAIL;
				if(Stm32BitIsSet(Ack[0],DS1821_COLLING_PIN)){
					TypeErrorTemp[T_COLLING]=TYPE_T_SHORT_CIRCUIT_1; //Замыкание 1
				}else{
					TypeErrorTemp[T_COLLING]=TYPE_T_SHORT_CIRCUIT_0; //Замыкание 0
				}
			}
		}else{
            TypeErrorTemp[T_COLLING]=STATUS_T_NORM; //Сбрассываем предыдуший флаг аварии
        }
		//--------------------------------------------------------
		if((Ack[0]&DS1821_UL_PIN)==(Ack[1]&DS1821_UL_PIN)){
			if(TypeErrorTemp[T_OUT]!=TYPE_T_BLOCK){	//Если авария не заблокирована
				Send_MSG(MSG_EXIST_ERROR);
				*ReturnValue=SENSOR_INIT_VALIDATION_FAIL;
				if(Stm32BitIsSet(Ack[0],DS1821_UL_PIN)){
					TypeErrorTemp[T_OUT]=TYPE_T_SHORT_CIRCUIT_1; //Замыкание 1
				}else{
					TypeErrorTemp[T_OUT]=TYPE_T_SHORT_CIRCUIT_0; //Замыкание 0
				}
			}
		}else{
            TypeErrorTemp[T_OUT]=STATUS_T_NORM; //Сбрассываем предыдуший флаг аварии
        }
		//--------------------------------------------------------
	}
    //---------------------------------------------
PT_END(pt);
}

ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

и чем это проще традиционного подхода? вроде как при традиционном подходе писанины даже поменьше...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Вымогатель припоя
Сообщения: 574
Зарегистрирован: Вт ноя 02, 2010 17:46:37

Сообщение pokk »

Лучше тем что нету не каких delay, а структура программы осталась "как бы линейная".
Писанины много из за того что там у меня 4 датчика подключалось, и я хотел сделать универсально, по этому много лишнего(всякие проверки на КЗ).
Ответить

Вернуться в «Разные вопросы по МК»