Портал для радиолюбителей и разработчиков электроники · с 2003 годаРеклама на сайте
Найти компонент, схему или даташит

Даташиты, справочник отечественных приборов, схемы с разбором и живой форум


 
Опции темы

Вопросник по FreeRTOS

Непрочитано 24.12.2012, 17:24  
wellcom
Временная регистрация
 
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
wellcom на пути к лучшему
Вопрос Вопросник по FreeRTOS

Доброго времени суток форум. Изучаю FreeRTOS на базе Atmega128+AtmelStudio 6.
Затормозил на этапе использования очередей, а именно:
Код:
//определяю ст-ру, которая будет елементом очереди
typedef struct
{
	unsigned portBASE_TYPE uint8_Command;
	int32_t int32_Data_1;
	int32_t int32_Data_2;
	unsigned portBASE_TYPE  uint8_Data_3;
}CmdData; 

xQueueCMD = xQueueCreate ( 4, sizeof(CmdData)); //создаем очередь
Не могу вкурить как записать в такую очередь данные, прошу помощи
Реклама:
wellcom вне форума  
Непрочитано 24.12.2012, 19:54  
Hives
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

Код:
CmdData Data;
// Data ‹‹ ...;
xQueueSend(xQueueCMD, (void*) &Data, (portTickType) 0);
?
Hives вне форума  
Сказали "Спасибо" Hives
wellcom (25.12.2012)
Непрочитано 09.01.2013, 14:40  
wellcom
Временная регистрация
 
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
wellcom на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

паривет! подскажите пожалуйста как лучше передать большой строковый масив в UART - через очередь или как то по другому. пытался делать так - не работает должным образом (очередь на 32 байта, в массиве больше 32 байт) и в UART получаю только начало и конец маcсива.
Код:
const unsigned portBASE_TYPE sHlpStrLong [] PROGMEM="большой масив"
void HelpTask (void *pvParameters)
{
	unsigned portBASE_TYPE *c;
	uint8_t symb;
	c = (uint8_t*) sHlpStrLong; //берем начало масива
	while(1)//(pgm_read_byte (&c[i])!=0x0)/*&&(i‹TX_BUFFER_SIZE)*/
	{
		symb = pgm_read_byte (c);
		//vTaskDelay(1/portTICK_RATE_MS); //_delay_ms(1);
		if (xQueueSendToBack(xQueueUartTX,(void*) &symb,(portTickType)portMAX_DELAY)!=pdPASS) //==pdPASS только тогда когда данные успешно отправлены
		{
			PORTC =0x0	;
		}
		else
		{
			if(symb==0x0) //если конец масива
			{
			  vTaskDelete(NULL);/* Убить после выполнения */		
			}
		    c++;
		}
	}
}
Читал, что можно передавать строки через очередь с помощью указателей, мозг сломал - не пойму как это сделать. Help!
wellcom вне форума  
Непрочитано 09.01.2013, 14:58  
Hives
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

я могу дико ошибаться, но какая связь между очередями и uart?
Hives вне форума  
Непрочитано 09.01.2013, 15:04  
wellcom
Временная регистрация
 
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
wellcom на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

Сообщение от Hives Посмотреть сообщение
я могу дико ошибаться, но какая связь между очередями и uart?
есть у меня такая задача по отправке байт в уарт...
Код:
void vGatekeeperUART_TX_Task( void *pvParameteres )  //отправка данных из очереди в UART
{
	uint8_t Byte;
	for(;;)
	{
	  xQueueReceive( xQueueUartTX, &Byte, portMAX_DELAY);   //ожидаем получения новых данных, задача в это время заблокирована
		
	  UART_SendChar(Byte); //первый символ в UDR, остальные в масив и по прерыванию отправляются
        }
}
и мне нужно передать большой char-ровский масив в тот же уарт.
wellcom вне форума  
Непрочитано 09.01.2013, 15:33  
Hives
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

а неоправданно повышенные накладные расходы на передачу каждого байта не смущают?

для начала я бы определился с моделью передачи:
1. задача готовит данные, передает их, ждет завершения передачи и анализирует результат обмена
2. задача готовит буфер с данными, отдает его на передачу и забывает о нем.

у вас как?
Hives вне форума  
Непрочитано 09.01.2013, 15:46  
wellcom
Временная регистрация
 
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
wellcom на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

так и есть, неоправданно повышенные расходы на передачу...как их побороть???
Вариант 2. Задача (vGatekeeperUART_TX_Task) ждет появления данных в очереди и передает их в буфер на передачу (первый символ сразу в UDR что бы потом по прерыванию передать остальные). Передает, но только начало и конец масива а он около 600 символов и это не предел.
Вот часть недостающего кода
Код:
void UART_SendChar(uint8_t c) 
{                          
taskENTER_CRITICAL();
         if ((tx_rd_index!=tx_wr_index) || ((UCSR0A & DATA_REGISTER_EMPTY)==0)) //если идет передача - остальные в буфер и по прерыванию
	{                                                                    
	 if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;              
         tx_buffer[tx_wr_index]=c;                                         
	} //вначале отправим символ сразу в UDR
	else
	{                                                                     
	  UDR0=c; 
	};
taskEXIT_CRITICAL(); 										
	return;
}

Последний раз редактировалось wellcom; 09.01.2013 в 17:46.
wellcom вне форума  
Непрочитано 09.01.2013, 21:16  
Hives
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

как-как - кидать данные блоками, разумеется.
для начала сделай нормальное FIFO а эту гадость SendChar() выкинь нафиг.
через очередь прокидывай только адрес/размер блока на передачу.
// пример fifo могу дать, в принципе пример передающей задачи тоже. если хочешь
Hives вне форума  
Непрочитано 09.01.2013, 21:55  
Boba_spb
Почётный гражданин KAZUS.RUN
 
Регистрация: 08.06.2008
Сообщений: 1,393
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
Boba_spb на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

Кидать через очередь адрес/размер - то ж геморройно. Ибо перед тем как по этому же адресу заполнять новые данные, надо будет ожидать пока этот адрес не уберется из очереди. Или заводить адрес в куче.
Уж лучше буфер завести у передатчика и через неего ....
Boba_spb вне форума  
Непрочитано 09.01.2013, 22:38  
Hives
Гражданин KAZUS.RUN
 
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
Hives на пути к лучшему
По умолчанию Re: Вопросник по FreeRTOS

тогда придется реализовывать модель #1, а автору хоцца #2.
Hives вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 07:14.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.