2011-02-28 4 views
3

PIC32MX 스타터 키트에서 PIC32 마이크로 컨트롤러 용 FreeRTOS 포트를 사용하고 있습니다. 그냥 작업과 놀고 있었지만 작업은 컨텍스트 전환이 아닙니다. 여기 내 기본 설정이 있습니다 :FreeRTOS 작업이 컨텍스트 스위칭이 아닙니다.

#define configMAX_PRIORITIES ((unsigned portBASE_TYPE) 5) 
#define configKERNEL_INTERRUPT_PRIORITY   0x01 
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 0x03 
#define configTICK_RATE_HZ    ((portTickType) 100) 

두 개의 LED가 깜박이는 두 가지 작업이 있습니다. 둘 다 우선 순위가 4 (가장 높음)입니다. 정상 작동 상태에서 LED는 각 100 틱마다 번갈아 깜박 여야합니다. 그러나 이것은 일어나지 않습니다. 두 번째 LED가 100 tick 동안 깜박이고 컨트롤이 일반 예외 처리기로 이동합니다. 왜 이런 일이 생길까요? 어떤 스케줄도 전혀없는 것처럼 보입니다.

+2

작업 코드를 보지 않고 누가 알 수 있습니까? 디버거에서 무엇을 말합니까? 예외 처리기를 쳤을 때 호출 스택을 확인하여 호출 스택과 그 태스크 (또는 스케줄러)를 확인합니다. – Clifford

+0

보드 용 포트/데모를 사용하고 있습니까? 작동 했나요? – XTL

답변

4

라운드 로빈 스케줄러가 있습니까? 당신의 일은 어떤 시간 동안 자고 있습니까 아니면 항복 (또는 바쁜 대기)입니까?

임베디드 OS에서 매우 일반적으로 발생하는 문제는 스케줄러가 동일한 우선 순위의 여러 프로세스를 공평하게 계획하지 않는다는 것입니다. 즉, A가 산출되면, A가 실행 가능하다면 A가 연령대에 대해 CPU를 가지고 있지 않더라도 즉시 다시 스케줄 될 수 있습니다. 공정한 일정 계획을 세우기 위해 많은 노력을 기울이는 데스크톱 OS에 익숙하다면 (또는 적어도 나에게있어) 매우 직관력이 떨어진다. 이에 실행하는 경우

, 당신은 당신의 작업은 다음과 같이 있는지 확인하는 것이 좋습니다 :

for (;;) 
{ 
    led(on); sleep(delay); 
    led(off); sleep(delay); 
} 

이 ... 작업이 실제로 깜박 사이에 실행 가능한 것을 중지하도록.

for (;;) 
{ 
    led(on); 
    led(off); 
} 

(또한, 일반적으로, 당신은 당신이 정말 필요합니다 알지 못한다면 당신이 경우 --- 오히려 높은 우선 순위보다 일반 우선 순위를 사용하려면 :이처럼 보이는 경우가 작동하지 않습니다 시스템이 이상하게 작동하거나 충돌 할 수있는 시스템 작업을 중지 시키십시오.)

4

두 작업이 잘 등록되어 있고 스케줄러가 시작 되었습니까? 일을 할 것이다 다음 코드와 같은

뭔가 :

xTaskCreate(yourFirstTask, "firstTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL); 
xTaskCreate(yourSecondTask, "secondTask", STACK_SIZE, NULL, TASK_PRIORITY, NULL); 
vTaskStartScheduler(); 

또한 추가 할 수있는 응용 프로그램 틱 후크 틱 중단이 제대로 발생하는지 확인하거나 눈금 타이머에 문제가있는 경우.

+1

'xTaskCreate'의 리턴 값을 확인하여 태스크 생성에 필요한 메모리가 부족하여 태스크 생성이 실패하지 않았는지 확인하십시오. – semaj

6

FreeRTOS는 우선 순위 기반 선행 스케줄러이므로 프로세서 시간을 산출하지 않는 동일한 우선 순위의 작업은 라운드 로빈 예정입니다. 라운드 로빈 스케줄링에 의존하는 것은 실시간 작업에 거의 적합하지 않으며 구성된 시간 조각에 따라 타이밍이 엉망이 될 수 있습니다. 타임 슬라이싱을 사용할 수 없게 될 수도 있습니다.

귀하의 작업은 차단 된 상태를 입력해야만 서로가 의도 한대로 작동 할 수 있도록 일정 시간 (예 : 경과 시간) 대기 상태가됩니다.

즉, 하나의 태스크가 다른 태스크를 굶주 리거나 의도 한 타이밍으로 실행되지 않고 예외 핸들러에 진입하는 것은 다른 문제입니다. 이를 위해서는 추가 정보를 게시해야하지만, 첫 번째 방법은 디버거를 배포하는 것입니다.

3

FreeRTOS/Demo/Common/Minimal/flash.c 소스 파일의 LED를 깜박이는 표준 데모 작업이 있습니다. 이 파일에서 생성 된 작업은 표준 PIC32 데모 애플리케이션 (Microchip Explorer16 보드를 대상으로 함)에 포함되어 있습니다.매우 간단한 형태

, 단지 전환 및 LED 모든 500ms로는 다음과 같이 할 작업 :

/* Standard task prototype, the parameter is not used in this case. */  
void vADummyTask(void *pvParameters) 
{ 
const portTickType xDelayTime = 500/portTICK_RATE_MS; 

    for(;;) 
    { 
     ToggleLED(); 
     vTaskDelay(xDelayTime); 
    }   
} 
5

절대 먼저 중단 당신의 "틱"입니다 확인합니다. 종종 인터럽트는 활성화되지 않고 타이머는 올바르게 설정되지 않고 PIC32를 설정하는 #pragma의 클럭이 제대로 구성되지 않습니다. 모든 문제는 "틱"이없는 상황에서 먼저 나타납니다.

틱 인터럽트가 발생하지 않는 경우 태스크 전환이 발생하지 않습니다. 이것이 정상적인 선점 작업 전환이 이루어지는 곳입니다.

MPLAB에서 "off the shelf demo"를 사용한다고 가정하면 void vPortIncrementTick(void) 함수 (FreeRTOS \ Source \ portable \ MPLAB \ PIC32MX \ port.c의 177 줄 주위)에 중단 점을 설정하고 코드를 실행하십시오 . 중단 점이 있으면 타이머 틱이 작동합니다.