Part Number: EK-TM4C1294XL
Hi,
Not sure why, but sscanf is causing a system fault in my code. It always had run fine, but I did something with the program that sscanf no longer works. To make things worse, I modified the program a lot and it is heavily modular (with lots of .c and .h files). What in the world would cause this fault ISR?
One example of sscanf usage is below:
/*
* blink.c
*
* Created on: 24 de jan de 2017
* Author: Helder Sales
*/
#include "blink.h"
#include "../../includes.h"
inline void Blink_InitLedPins(void)
{
ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_GPION);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_GPION);
ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOF);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOF);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPION);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_GPION) || !ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_GPIOF));
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4);
}
inline float Init_Timer0(float freq)
{
ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_TIMER0);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_TIMER0);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0);
while(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0));
ROM_TimerClockSourceSet(TIMER0_BASE, TIMER_CLOCK_PIOSC);
ROM_TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC);
float fPeriod = 16000000/(freq*2);
ROM_TimerLoadSet(TIMER0_BASE, TIMER_A, fPeriod -1);
ROM_IntEnable(INT_TIMER0A);
ROM_TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
ROM_IntPrioritySet(INT_TIMER0A, 0xE0);
ROM_TimerEnable(TIMER0_BASE, TIMER_A);
return(0);
}
void Timer0IntHandler(void)
{
ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
if(ROM_GPIOPinRead(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1) && ROM_GPIOPinRead(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4))
{
ROM_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1, 0);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4, 0);
}
else
{
ROM_GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_PIN_0 | GPIO_PIN_1);
ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_4, GPIO_PIN_0 | GPIO_PIN_4);
}
}
inline int blink_main(int argc, char *argv[])
{
if(argc != 2)
return(CMD_ERROR);
if(strcmp(argv[1], "stop") == 0)
{
if(!ROM_SysCtlPeripheralReady(SYSCTL_PERIPH_TIMER0))
{
UARTprintf("\nBlink nao estava em execucao.\n\n");
return(0);
}
ROM_IntDisable(INT_TIMER0A);
ROM_TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);
ROM_TimerDisable(TIMER0_BASE, TIMER_A);
ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_TIMER0);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_TIMER0);
ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_GPION);
ROM_SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOF);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_GPION);
ROM_SysCtlPeripheralReset(SYSCTL_PERIPH_GPIOF);
UARTprintf("\nTerminou a execucao do blink.\n");
return(CMD_SUCESS);
}
float freq;
char ch;
//to verify characters, and return error status if found any
int8_t condition = sscanf(argv[1], "%f%c", &freq, &ch);
if (freq < 0 || condition != 1)
return(CMD_ERROR);
Blink_InitLedPins();
Init_Timer0(freq);
return(CMD_SUCESS);
}