Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AT91SAM9+freertos+GCC
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Fedor
Уважаемые форумчане!
Устал уже копать, не пойму где накосячил. Пытаюсь сделать порт для процесора AT91SAM9G45 порт freertos на gcc и не пойму в чем проблема.
Задачи работают только один круг и тишина...
За основу брал исходник из примеров для AT91sam7x
поменял под себя скрипт для ld и board_startup.S.
Кеширование запретил, гружу все dram bootstrap'ом и про
"/* We want to start in supervisor mode. Operation will switch to system
mode when the first task starts. */"
незабыл.

CODE
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 1
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( ( unsigned long ) BOARD_MCK )
#define configTICK_RATE_HZ ( ( portTickType ) 100 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 512 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 128*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 1
#define configCHECK_FOR_STACK_OVERFLOW 1
#define configUSE_RECURSIVE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 10
#define configUSE_COUNTING_SEMAPHORES 1

#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 4 )
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet 1
#define INCLUDE_uxTaskPriorityGet 1
#define INCLUDE_vTaskDelete 0
#define INCLUDE_vTaskCleanUpResources 0
#define INCLUDE_vTaskSuspend 1
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1

//#define configYIELD_INTERRUPT_VECTOR 16UL
#define configKERNEL_INTERRUPT_PRIORITY 1
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4

//void vApplicationSetupInterrupts( void );

#define USE_STDIO

#endif /* FREERTOS_CONFIG_H */


Пять задач выкидывают в dbgu по символу, вроде размера кучи и стека достаточные

CODE
#include <board.h>
#include <utility/trace.h>
#include <stdio.h>
#include "board_memories.h"

#include "FreeRTOS.h"
#include "task.h"
#include "standarttasks/integer.h"
#include "standarttasks/PollQ.h"

//------------------------------------------------------------------------------
// Local definitions
//------------------------------------------------------------------------------



//------------------------------------------------------------------------------
// Local variables
//------------------------------------------------------------------------------


//------------------------------------------------------------------------------
// Local functions
//------------------------------------------------------------------------------
static void traceTask1 (void * pvParameters);
static void traceTask2 (void * pvParameters);
static void traceTask3 (void * pvParameters);
static void traceTask4 (void * pvParameters);
static void traceTask5 (void * pvParameters);


//------------------------------------------------------------------------------
/// Application entry point. Configures the DBGU, PIT for SAM7 & SAM9
/// microcontrollers, UART and System tick for SAM3 microcontrollers.
/// Configures TC0, LEDs and buttons and makes LED\#1 blink in its infinite
/// loop, using the Wait function.
/// \return Unused (ANSI-C compatibility).
//------------------------------------------------------------------------------
int main(void)
{
register unsigned long count;
// DBGU output configuration
TRACE_CONFIGURE(DBGU_STANDARD, 115200, BOARD_MCK);
printf("-- Getting Started Project %s --\n\r", SOFTPACK_VERSION);
printf("-- %s\n\r", BOARD_NAME);
printf("-- Compiled: %s %s --\n\r", __DATE__, __TIME__);

//CP15_EnableIcache();
//CP15_DisableIcache();
//CP15_DisableMMU();
//CP15_DisableDcache();

//BOARD_ConfigureDdram(1, BOARD_DDRAM_BUSWIDTH);

//vStartIntegerMathTasks(tskIDLE_PRIORITY+1);
//vStartPolledQueueTasks(tskIDLE_PRIORITY+1);

portBASE_TYPE retcode;
retcode = xTaskCreate(traceTask1, "TraceTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
if(retcode!= pdPASS){
TRACE_ERROR("Bad create task \r\n");
}
retcode = xTaskCreate(traceTask2, "TraceTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
if(retcode != pdPASS){
TRACE_ERROR("Bad create task \r\n");
}
retcode = xTaskCreate(traceTask3, "TraceTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
if(retcode!= pdPASS){
TRACE_ERROR("Bad create task \r\n");
}
retcode = xTaskCreate(traceTask4, "TraceTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
if(retcode!= pdPASS){
TRACE_ERROR("Bad create task \r\n");
}
retcode = xTaskCreate(traceTask5, "TraceTask", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, NULL);
if(retcode!= pdPASS){
TRACE_ERROR("Bad create task \r\n");
}


TRACE_INFO("Start scheduler \n\r");
vTaskStartScheduler();

for(;;);

// while(1){
// printf("tic-tac \n\r");
// count = 1000000;
// while(count--){;}
//
// }
}

/**
* @brief Print task
*/
static void traceTask1 (void * pvParameters)
{
char* strToPrint;
strToPrint = 0;
DBGU_PutChar('i');
for(;;){
DBGU_PutChar('1');
DBGU_PutChar('\n');
DBGU_PutChar('\r');
//printf("tic 1 \n\r");
/*
strToPrint = pcPrintGetNextMessage(0);
if((strToPrint) != 0 ){
TRACE_INFO("%s", strToPrint);
}*/
}
}

static void traceTask2 (void * pvParameters)
{
char* strToPrint;
strToPrint = 0;
DBGU_PutChar('i');
for(;;){
DBGU_PutChar('2');
DBGU_PutChar('\n');
DBGU_PutChar('\r');
//printf("tic 2 \n\r");
/*
strToPrint = pcPrintGetNextMessage(0);
if((strToPrint) != 0 ){
TRACE_INFO("%s", strToPrint);
}*/
}
}

static void traceTask3 (void * pvParameters)
{
char* strToPrint;
strToPrint = 0;
DBGU_PutChar('i');
for(;;){
DBGU_PutChar('3');
DBGU_PutChar('\n');
DBGU_PutChar('\r');
//printf("tic 3 \n\r");
/*
strToPrint = pcPrintGetNextMessage(0);
if((strToPrint) != 0 ){
TRACE_INFO("%s", strToPrint);
}*/
}
}

static void traceTask4 (void * pvParameters)
{
char* strToPrint;
strToPrint = 0;
DBGU_PutChar('i');
for(;;){
//printf("tic 4 \n\r");
DBGU_PutChar('4');
DBGU_PutChar('\n');
DBGU_PutChar('\r');
/*
strToPrint = pcPrintGetNextMessage(0);
if((strToPrint) != 0 ){
TRACE_INFO("%s", strToPrint);
}*/
}
}

static void traceTask5 (void * pvParameters)
{
char* strToPrint;
strToPrint = 0;
DBGU_PutChar('i');
for(;;){
//printf("tic 4 \n\r");
DBGU_PutChar('5');
DBGU_PutChar('\n');
DBGU_PutChar('\r');
/*
strToPrint = pcPrintGetNextMessage(0);
if((strToPrint) != 0 ){
TRACE_INFO("%s", strToPrint);
}*/
}
}


void vApplicationStackOverflowHook( xTaskHandle xTask,
signed portCHAR *pcTaskName )
{
printf("stack_o\r\n");
printf("%s",pcTaskName);
}

void vApplicationIdleHook( void )
{
TRACE_INFO_WP("\n\ridle\n\r");
}

Все собираю под arm-mode без thumb
Буду рад если кто-нибудь поделится нюансами портирования
Увы весь проект загрузить пока форум не дает.
aaarrr
Добавьте TickHook, убедитесь, что тикает.
Fedor
Цитата(aaarrr @ Sep 19 2012, 01:07) *
Добавьте TickHook, убедитесь, что тикает.

Тикает
Стабильно все задачи отрабатывают по одному разу т.е. видим в терминале
5
5
5
1
1
1
2
2
...
4
4
и все дальше снова в 5 не переключается
Fedor
Выяснилось, что из-за ключика --gc-sections линкер убирал сегмент с моими векторами прерываний.
В итоге в sram по 0x0 адресу ничего не грузилось и там оставались вектора прерываний от bootstrap с хитромудрым обработчиком прерываний от AIC.
Спасибо тем кто ответил. Вопрос закрыт.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.