Quality RTOS & Embedded Software

 Real time embedded FreeRTOS RSS feed 
Real time embedded FreeRTOS mailing list 
Quick Start Supported MCUs PDF Books Trace Tools Ecosystem TCP & FAT Training




Loading

Problem Scanf()

Posted by kamran99kamran on March 17, 2014

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);

}


Problem Scanf()

Posted by davedoors on March 17, 2014

Is your question related to FreeRTOS? If it is even implemented, how are you expecting scanf() to work in whichever C library you are using? I would expect it to make everything stop while it waited from a line of input, which I think is what you said it did.


Problem Scanf()

Posted by rtel on March 17, 2014

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.


Problem Scanf()

Posted by kamran99kamran on March 17, 2014

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


Problem Scanf()

Posted by kamran99kamran on March 17, 2014

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!


Problem Scanf()

Posted by rtel on March 17, 2014

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.


[ Back to the top ]    [ About FreeRTOS ]    [ Sitemap ]    [ ]




Copyright (C) 2004-2010 Richard Barry. Copyright (C) 2010-2016 Real Time Engineers Ltd.
Any and all data, files, source code, html content and documentation included in the FreeRTOSTM distribution or available on this site are the exclusive property of Real Time Engineers Ltd.. See the files license.txt (included in the distribution) and this copyright notice for more information. FreeRTOSTM and FreeRTOS.orgTM are trade marks of Real Time Engineers Ltd.

Latest News:

FreeRTOS V9.0.0 is now available for download.


Free TCP/IP and file system demos for the RTOS


Sponsored Links

⇓ Now With No Code Size Limit! ⇓
⇑ Free Download Without Registering ⇑


FreeRTOS Partners

ARM Connected RTOS partner for all ARM microcontroller cores

Renesas Electronics Gold Alliance RTOS Partner.jpg

Microchip Premier RTOS Partner

RTOS partner of NXP for all NXP ARM microcontrollers

Atmel RTOS partner supporting ARM Cortex-M3 and AVR32 microcontrollers

STMicro RTOS partner supporting ARM7, ARM Cortex-M3, ARM Cortex-M4 and ARM Cortex-M0

Xilinx Microblaze and Zynq partner

Silicon Labs low power RTOS partner

Altera RTOS partner for Nios II and Cortex-A9 SoC

Freescale Alliance RTOS Member supporting ARM and ColdFire microcontrollers

Infineon ARM Cortex-M microcontrollers

Texas Instruments MCU Developer Network RTOS partner for ARM and MSP430 microcontrollers

Cypress RTOS partner supporting ARM Cortex-M3

Fujitsu RTOS partner supporting ARM Cortex-M3 and FM3

Microsemi (previously Actel) RTOS partner supporting ARM Cortex-M3

Atollic Partner

IAR Partner

Keil ARM Partner

Embedded Artists