FreeRTOS problem, vTaskGetRunTimeStats

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av Korken »

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:

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);
	}
}
Config:

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 */
Timer init:

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
}
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Re: FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av monstrum »

Fick inte heller igång den funktionen först. Upptäckte dock att mina processnamn var längre än den defininerade maxlängden (configMAX_TASK_NAME_LEN). Ändrade denna till 20 och då fungerade det. Har du testat att strippa ner programmet så du bara kör en eller ett par tasks och se om det funkar då?
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av Korken »

Jag ska testa det med configMAX_TASK_NAME_LEN, tackar!
När jag testar så kör jag ett program med en loop i bara för å ta tid samt en task som ska skriva ut strängen och Idle, kan inte få det så mycket mindre tror jag. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av sodjan »

Men parametern har väl med längden på själva *namnet*
på tasket/tasken at göra, inte längden/storleken på tasket i sig.
monstrum
Inlägg: 620
Blev medlem: 13 januari 2005, 05:38:32
Ort: Göteborg

Re: FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av monstrum »

Ja det är själva namnet på tasken som avses. Dock används denna i stats-funktionen och därför är det viktigt att det får plats (inklusive nollterminering).

Testa annars en annan minnesprofil bara för att utesluta detta. Det finns tre olika medskickade i FreeRTOS som allokerar minne (trådsäkert). heap1, heap2, heap3 har jag för mig dom heter. 3:an bör vara den som funkar i de flesta fall (använder malloc och free), du kan ju börja med att testa den. Själv fick jag aldrig runtime-statsen att funka med den andra (heap2) minnesvarianten. Varför just statsfunktionen inte fungerade vet jag inte.
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av Korken »

Jag har nu testat att göra längden på namnet större och alla olika head_x.c och det fungerar fortfarande inte.
Nåja, får fundera vidare på det.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av sodjan »

Ja, om du inte hade task-namn längre än 12 tecken så var det ju förväntat... :-)
Användarvisningsbild
Korken
Inlägg: 2230
Blev medlem: 3 februari 2006, 19:19:36
Ort: Luleå, Porsön

Re: FreeRTOS problem, vTaskGetRunTimeStats

Inlägg av Korken »

Sant så sant, men man kunde ju hoppas. ;)
Skriv svar