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

 
 
> FreeRTOS. Не нравится как работает очередь.
inventor
сообщение Dec 8 2015, 14:29
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



Переделываю прогу во FreeRTOS - взял в качестве примера работу с портом
мне нужно передвать и принимать данные с модуля SIM900
сначала у меня было сделано со "своим" круговыми буферами на прием и передачу
все работало на ура, потом переделал как в примере - работает через пень колоду.
такое ощущение что просто не успевает принять все символы.
В чем может быть проблема, подскажите?

С очередями как в примере freertos
CODE

/**
* Прерывание от USART2
*/
void USART2_IRQHandler(void)
{
char byte;
volatile u32 status;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

status = USART2->SR;

/* Read one byte from the receive data register */
if (status & USART_FLAG_RXNE) {
byte = USART_ReceiveData(USART2);
xQueueSendFromISR(qRxGsmQueue, &byte, &xHigherPriorityTaskWoken);
}

/* Write one byte to the transmit data register */
if (status & USART_FLAG_TXE) {
/* Берем байт из очереди */
if (xQueueReceiveFromISR(qTxGsmQueue, &byte, &xHigherPriorityTaskWoken) == pdTRUE) {
/* A character was retrieved from the queue so can be sent to the THR now. */
USART_SendData(USART2, byte);
} else {
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}

/**
* Прием строки из кольцевого буфера
*/
int gsm_get_str(char *str, int len)
{
int i = 0;
u8 byte;

/* Get the next character from the buffer. Return false if no characters are available, or arrive before xBlockTime expires. */
while (xQueueReceive(qRxGsmQueue, &byte, 0) && i < len) {
str[i++] = byte;
}

str[i] = 0; /* Занулим строку */
return i;
}



Вот это вариант работает
CODE
void USART2_IRQHandler(void)
{
char byte;
volatile u32 status;
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;

status = USART2->SR;

/* Read one byte from the receive data register */
if (status & USART_FLAG_RXNE) {
byte = USART_ReceiveData(USART2);
// xQueueSendFromISR(qRxGsmQueue, &byte, &xHigherPriorityTaskWoken);
gsm_read_byte_isr(byte);
}

/* Write one byte to the transmit data register */
if (status & USART_FLAG_TXE) {
gsm_write_byte_isr();
/* Disable the USART2 Transmit interrupt */
/* USART_ITConfig(USART2, USART_IT_TXE, DISABLE); */
}
portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}

/* Передача строки по-прерываниям - заталкиваем в кольцевой буфер данные */
int gsm_send_buf(u8 * buf, int len)
{
int i = 0;
u8 byte;

/* Пока буфер не заполница */
while (!cb_is_full(&cb_tx) && i < len) {
byte = buf[i++];
cb_write(&cb_tx, &byte);
}

/* Включаем прерывание */
USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
return i;
}

/* Передать один байт, когда передавать нечего - выключить передатчик */
void gsm_write_byte_isr(void)
{
volatile u8 byte;

/* Передаем, пока буфер не пустой. Иначе - выключаем прерывания. */
if (!cb_is_empty(&cb_tx)) {
cb_read(&cb_tx, (ElemType *) & byte);
USART_SendData(USART2, byte);
} else {
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}

/* Прием строки из кольцевого буфера */
int gsm_get_str(char *str, int len)
{
int i = 0;
u8 byte;

while (!cb_is_empty(&cb_rx) && i < len) {
cb_read(&cb_rx, (ElemType *) & byte);
str[i++] = byte;
}
str[i] = 0; /* Занулим строку */
return i;
}

/**
* Обслуживание GPRS модема - прием ответа
* Записываем символ в кольцевой буфер
*/
void gsm_read_byte_isr(u8 rx_byte)
{
cb_write(&cb_rx, &rx_byte);
}
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 10:20
Рейтинг@Mail.ru


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