FreeRTOS problem, vTaskGetRunTimeStats
Postat: 12 juli 2011, 15:49:25
Godagens!
Jag håller på och testar FreeRTOS som en tok på min LPC1768 och det fungerar bra förutom en grej.
Jag vill se hur mycket processorkraft som går åt till allt så kompilerar med vTaskGetRunTimeStats.
Men när jag kör den funktionen och försöker skriva till en buffer så får jag en hard fault och CPUn resetar.
Vad kan göra så det blir så?
Jag har testat att göra buffern och programmets stack löjligt stora så det tycks inte vara det.
Timer räknar som den ska också.
Kod:
Config:
Timer init:
Jag håller på och testar FreeRTOS som en tok på min LPC1768 och det fungerar bra förutom en grej.
Jag vill se hur mycket processorkraft som går åt till allt så kompilerar med vTaskGetRunTimeStats.
Men när jag kör den funktionen och försöker skriva till en buffer så får jag en hard fault och CPUn resetar.
Vad kan göra så det blir så?
Jag har testat att göra buffern och programmets stack löjligt stora så det tycks inte vara det.
Timer räknar som den ska också.
Kod:
Kod: Markera allt
void vTask3(void *pvParameters)
{
static signed char buffer[200] = {0};
while (1)
{
vTaskDelay(5000 / portTICK_RATE_MS);
vTaskGetRunTimeStats(buffer);
//UART0_SendString(buffer);
}
}
Kod: Markera allt
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H
#include "LPC17xx.h"
/*-----------------------------------------------------------
* Application specific definitions.
*
* These definitions should be adjusted for your particular hardware and
* application requirements.
*
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
*----------------------------------------------------------*/
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( ( unsigned long ) 100000000 )
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 80 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 10 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 12 )
#define configUSE_TRACE_FACILITY 0
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 0
#define configUSE_CO_ROUTINES 0
#define configUSE_MUTEXES 0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
#define configUSE_COUNTING_SEMAPHORES 0
#define configUSE_ALTERNATIVE_API 0
#define configCHECK_FOR_STACK_OVERFLOW 0
#define configUSE_RECURSIVE_MUTEXES 0
#define configQUEUE_REGISTRY_SIZE 10
#define configGENERATE_RUN_TIME_STATS 1
/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */
#define INCLUDE_vTaskPrioritySet 0
#define INCLUDE_uxTaskPriorityGet 0
#define INCLUDE_vTaskDelete 0
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_uxTaskGetStackHighWaterMark 0
/* Use the system definition, if there is one */
#ifdef __NVIC_PRIO_BITS
#define configPRIO_BITS __NVIC_PRIO_BITS
#else
#define configPRIO_BITS 5 /* 32 priority levels */
#endif
/* The lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY ( 31 << (8 - configPRIO_BITS) )
/* Priority 5, or 160 as only the top three bits are implemented. */
#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 5 << (8 - configPRIO_BITS) )
/* Priorities passed to NVIC_SetPriority() do not require shifting as the
function does the shifting itself. Note these priorities need to be equal to
or lower than configMAX_SYSCALL_INTERRUPT_PRIORITY - therefore the numeric
value needs to be equal to or greater than 5 (on the Cortex-M3 the lower the
numeric value the higher the interrupt priority). */
#define configEMAC_INTERRUPT_PRIORITY 5
#define configUSB_INTERRUPT_PRIORITY 6
/*-----------------------------------------------------------
* Macros required to setup the timer for the run time stats.
*-----------------------------------------------------------*/
extern void vConfigureTimerForRunTimeStats(void);
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() vConfigureTimerForRunTimeStats()
#define portGET_RUN_TIME_COUNTER_VALUE() LPC_TIM1->TC
#endif /* FREERTOS_CONFIG_H */
Kod: Markera allt
/**
* @brief Timer1 is for the timing of inputs and other miscellaneous stuff.
* Counting at 1 MHz, no interrupt, just reset on match.
*/
void Timer1_Init(void)
{
LPC_SC->PCONP |= (1<<PCTIM1); // Power up the timer
LPC_SC->PCLKSEL0 |= (1<<PCLK_TIMER1); // Timer clock source CLK = 100MHz
LPC_TIM1->PR = 99; // Timer prescaler
LPC_TIM1->MR0 = 0xFFFFFFFF; // Match value, Frequency of reset = 100MHz/((PR+1)*MR0)
LPC_TIM1->MCR = (1<<MR0R); // Reset Counter on Match
LPC_TIM1->TCR = (1<<TIM_START); // Start Timer
}