24.12.2012, 17:24
|
#1
|
Временная регистрация
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Вопросник по 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)); //создаем очередь |
Не могу вкурить как записать в такую очередь данные, прошу помощи
|
|
|
|
24.12.2012, 19:54
|
#2
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Вопросник по FreeRTOS
Код:
|
CmdData Data;
// Data ‹‹ ...;
xQueueSend(xQueueCMD, (void*) &Data, (portTickType) 0); |
?
|
|
|
|
09.01.2013, 14:40
|
#3
|
Временная регистрация
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
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!
|
|
|
|
09.01.2013, 14:58
|
#4
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Вопросник по FreeRTOS
я могу дико ошибаться, но какая связь между очередями и uart?
|
|
|
|
09.01.2013, 15:04
|
#5
|
Временная регистрация
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
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-ровский масив в тот же уарт.
|
|
|
|
09.01.2013, 15:33
|
#6
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Вопросник по FreeRTOS
а неоправданно повышенные накладные расходы на передачу каждого байта не смущают?
для начала я бы определился с моделью передачи:
1. задача готовит данные, передает их, ждет завершения передачи и анализирует результат обмена
2. задача готовит буфер с данными, отдает его на передачу и забывает о нем.
у вас как?
|
|
|
|
09.01.2013, 15:46
|
#7
|
Временная регистрация
Регистрация: 25.09.2008
Сообщений: 95
Сказал спасибо: 39
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
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.
|
|
|
|
09.01.2013, 21:16
|
#8
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Вопросник по FreeRTOS
как-как - кидать данные блоками, разумеется.
для начала сделай нормальное FIFO а эту гадость SendChar() выкинь нафиг.
через очередь прокидывай только адрес/размер блока на передачу.
// пример fifo могу дать, в принципе пример передающей задачи тоже. если хочешь
|
|
|
|
09.01.2013, 21:55
|
#9
|
Почётный гражданин KAZUS.RU
Регистрация: 08.06.2008
Сообщений: 1,394
Сказал спасибо: 4
Сказали Спасибо 183 раз(а) в 167 сообщении(ях)
|
Re: Вопросник по FreeRTOS
Кидать через очередь адрес/размер - то ж геморройно. Ибо перед тем как по этому же адресу заполнять новые данные, надо будет ожидать пока этот адрес не уберется из очереди. Или заводить адрес в куче.
Уж лучше буфер завести у передатчика и через неего ....
|
|
|
|
09.01.2013, 22:38
|
#10
|
Гражданин KAZUS.RU
Регистрация: 25.11.2010
Сообщений: 516
Сказал спасибо: 1
Сказали Спасибо 126 раз(а) в 109 сообщении(ях)
|
Re: Вопросник по FreeRTOS
тогда придется реализовывать модель #1, а автору хоцца #2.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 04:55.
|
|