Quality RTOS & Embedded Software

 Real time embedded FreeRTOS RSS feed 
Quick Start Supported MCUs PDF Books Trace Tools Ecosystem


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 ]    [ Privacy ]    [ Sitemap ]    [ ]


Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.

Latest News

NXP tweet showing LPC5500 (ARMv8-M Cortex-M33) running FreeRTOS.

Meet Richard Barry and learn about running FreeRTOS on RISC-V at FOSDEM 2019

Version 10.1.1 of the FreeRTOS kernel is available for immediate download. MIT licensed.

View a recording of the "OTA Update Security and Reliability" webinar, presented by TI and AWS.


Careers

FreeRTOS and other embedded software careers at AWS.



FreeRTOS Partners

ARM Connected RTOS partner for all ARM microcontroller cores

Espressif ESP32

IAR Partner

Microchip Premier RTOS Partner

RTOS partner of NXP for all NXP ARM microcontrollers

Renesas

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

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

OpenRTOS and SafeRTOS

Xilinx Microblaze and Zynq partner