this does not work !!! if scanf is activate, then over the terminal does stop und doesn't work!!!
//scanf("%inr",&e);
//printf("%i",e);
And using with getchar the task is working very good!
I am using ARM COrtex M4F!
Maybe this is about problem with uart()!
Thanks!
reagrds Kamran
// =========================================================
// Copyright(C) 2014 Kamran
// Beschreibung: Abfrage + Ausgabe + DAC + ADC + Pin D8
// + FrreRTOS
// =========================================================
//Example code to loop back the data sent to USART2 on STM32F4DISCOVERY
//Inlcude header files
include "stm32f4xx.h"
include "FreeRTOS.h"
include "task.h"
include
include
include
include
include "stm32f4xx.h"
include "stm32f4xx_conf.h"
include "stm32f4xx_usart.h"
include "stm32f4xx_rcc.h"
include "stm32f4xx_gpio.h"
include "system_stm32f4xx.h"
include "FreeRTOSConfig.h"
include "stm32f4xx_tim.h"
include "uart.h"
//Task For Sending Data Via USART
static void UsartTask(void *pvParameters)
{
int x;
printf("rn"); // malloc
printf(">Herorn"); // malloc 2
putchar('t');
putchar('y');
printf("rn"); // malloc 3
while(1) {
// this does not work !!! if scanf is activate, then over the //terminal stop und doesn't work!!!
//scanf("%inr",&e);
//printf("%i",e);
int c;
printf("\r\n");
c = getchar();
putchar(c);
printf("\r\n");
printf("das war c: %c \n\r", c);
}while(1);
}
//Initialize GPIO and USART6
void initx(void)
{
uart_init(9600);
}
//Main Function
int main(void)
{
char buffer[256];
//Call initx(); To Initialize USART & GPIO
initx();
//Create Task For USART
xTaskCreate(UsartTask, (signed char*)"UsartTask", 128, NULL, tskIDLE_PRIORITY+1, NULL);
//Call Scheduler
vTaskStartScheduler();
}
/***************************************************************/
include "uart.h"
include "stm32f4xx.h"
include "ringbuf.h"
include
include
include
define RX_SIZE 128
define TX_SIZE 128
struct ringbuf rxbuf = { .buf = (char[RXSIZE]) {}, .bufsize = RXSIZE };
struct ringbuf txbuf = { .buf = (char[TXSIZE]) {}, .bufsize = TXSIZE };
static volatile struct uartstats {
uint32t rxoverrun;
uint32t rxbytes;
uint32t txbytes;
} uartstats;
void USART6IRQHandler(void)
{
if (USART6->SR & USARTSRRXNE) {
char c = USART6->DR;
if (!rbputc(&rxbuf, c))
uartstats.rxoverrun++;
else {
#if 0
/* ECHO */
rbputc(&txbuf, c);
USART6->CR1 |= USARTCR1TXEIE;
#endif
uartstats.rx_bytes++;
}
}
if (USART6->SR & USART_SR_TXE) {
char c;
if (rb_getc(&tx_buf, &c)) {
// send a queued byte
//
USART6->DR = c;
}
else {
// nothing to send, disable interrupt
//
USART6->CR1 &= ~USART_CR1_TXEIE;
}
uart_stats.tx_bytes++;
}
}
int uartcharsavail(void)
{
return rx_buf.len;
}
ssizet uartwriter(struct _reent *r, int fd, const void *ptr, sizet len)
{
const char c = (const char) ptr;
for (int i = 0; i < len; i++) {
while (!rb_putc(&tx_buf, *c));
c++;
// Enable TX empty interrupt
USART6->CR1 |= USART_CR1_TXEIE; // CR1 -> SR
}
return len;
}
ssizet uartreadr(struct _reent *r, int fd, void *ptr, sizet len)
{
while (!rx_buf.len);
if (len > rx_buf.len)
len = rx_buf.len;
char *c = (char*)ptr;
for (int i = 0; i < len; i++)
rb_getc(&rx_buf, c++);
return len;
}
void uartpollsend(const char ch)
{
while (ch) {
USART6->DR = *ch++ & 0xff;
while (!(USART6->SR & USARTFLAGTXE));
uartstats.txbytes++;
}
}
/**
* Initialize UART.
*
* param baudrate Baudrate
*
* PC6 USART6TXD
* PC7 USART7RXD
*
*/
void uartinit(int baudrate)
{
// Enable peripheral clocks
//
RCC->AHB1ENR |= RCCAHB1PeriphGPIOC;
RCC->APB2ENR |= RCCAPB2Periph_USART6;
#if 0
// Initialize Serial Port
//
GPIO_Init(GPIOC, &(GPIO_InitTypeDef) {
.GPIO_Pin = GPIO_Pin_6,
.GPIO_Speed = GPIO_Speed_50MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_OType = GPIO_OType_PP
});
GPIO_Init(GPIOC, &(GPIO_InitTypeDef) {
.GPIO_Pin = GPIO_Pin_7,
.GPIO_Mode = GPIO_Mode_IN,
.GPIO_PuPd = GPIO_PuPd_UP
});
#endif
#if 1
// Initialize Serial Port
//
GPIO_Init(GPIOC, &(GPIO_InitTypeDef) {
.GPIO_Pin = GPIO_Pin_6,
.GPIO_Speed = GPIO_Speed_50MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_PuPd = GPIO_PuPd_NOPULL,
.GPIO_OType = GPIO_OType_PP
});
GPIO_Init(GPIOC, &(GPIO_InitTypeDef) {
.GPIO_Pin = GPIO_Pin_7,
.GPIO_Speed = GPIO_Speed_50MHz,
.GPIO_Mode = GPIO_Mode_AF,
.GPIO_PuPd = GPIO_PuPd_NOPULL,
.GPIO_OType = GPIO_OType_PP
});
#endif
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
USART_Init(USART6, &(USART_InitTypeDef) {
.USART_BaudRate = baudrate,
.USART_WordLength = USART_WordLength_8b,
.USART_StopBits = USART_StopBits_1,
.USART_Parity = USART_Parity_No ,
.USART_HardwareFlowControl = USART_HardwareFlowControl_None,
.USART_Mode = USART_Mode_Rx | USART_Mode_Tx
});
NVIC_Init(&(NVIC_InitTypeDef) {
.NVIC_IRQChannel = USART6_IRQn,
.NVIC_IRQChannelPreemptionPriority = configLIBRARY_KERNEL_INTERRUPT_PRIORITY,
.NVIC_IRQChannelSubPriority = 0,
.NVIC_IRQChannelCmd = ENABLE
});
USART_ITConfig(USART6, USART_IT_RXNE , ENABLE);
USART_Cmd(USART6, ENABLE);
}
Is your scanf() configured to accept input from the UART? If so, how is this implemented? If it is polling the input then you could call scanf() from a single task provided that task was at a very low priority so as not to starve any higher priority tasks of processing time. A better technique would be to have an interrupt service routine buffer any characters that are coming in and have scanf() access the buffer only - if it is going to block for input then do it in such a way that allows other tasks to execute. For example, have the interrupt service routine give a semaphore when data is available, and implement the IO used by the scanf() function to block on the semaphore so it is unblocked only when data is ready to be processed.
FreeRTOS console IO is normally performed with FreeRTOS+CLI, and there are lots of examples of it being used in the FreeRTOS download. The examples all create another task to manage the command input, referring to one of the examples and the relevant documentation page will show you how to do this in a thread safe and multi-tasking friendly way.
Regards.
But why doesn't scanf() work, even I have involved heap_2.c.
And about uart, this is related to FreeRTOS, which is making getchar work.
this is because it can read only one letter/sign !
How can i change the program of FreeRTOS in uart, to read more letter, before i
I confirm the Enter key on keyboard
how are you expecting scanf() to work in whichever C library you are using?
I am using newlib C library!!
Thank you very much, my problem was solved!
this was because of
xTaskCreate(UsartTask, (signed char*)"UsartTask", 128, NULL, tskIDLE_PRIORITY+1, NULL)
and I changed from 128 to 1024. scanf() could do work!
I would recommend enabling the stack overflow hook function.
http://www.freertos.org/Stacks-and-stack-overflow-checking.html
I would also recommend making sure you are using a recent version and that configASSERT() is defined, as that will automatically check some of the more obscure but essential Cortex-M priority settings for you.
http://www.freertos.org/a00110.html#configASSERT
Regards.