문제

나는 토끼 4000 프로세서로 스테퍼 모터를 돌려주고 싶습니다. 나는 구조체를 보유하고있는 대기열을 가지고 있으며, 4 개의 권선 스테퍼 모터를 실행하는 데 필요한 바이너리 비트 시퀀스를 생성하는 기능을 만들었습니다. 나는 큐를 채우는 프로듀서에 구조체를 옆으로 전달하려고 노력하고 있습니다. 문제는 큐에있는 값을 입력하지 않습니다. 기능에서 구조체를 반환하는 방법을 오해하거나 배열 값을 개별적으로 지정해야합니까? 해당 코드의 관련 청크는 다음과 같습니다.

typedef struct {
    char d[4];
    int  delayUs;
} mQueueEntry_t;


mQueueEntry_t setDirStep(int count0, int count1, int count2, int count3){

 mQueueEntry_t entry;

        entry.d[0] = (!((count0+1)%4));                 //1a
        entry.d[1] = (!((count1+1)%4));                 //1b
        entry.d[2] = (!((count2+1)%4));                 //2a
        entry.d[3] = (!((count3+1)%4));                 //2b

        entry.delayUs =10;
        printf("Breaking Funct with: %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);
}

// continually stuff a queue with a dedicated structure
void Producer(void* pdata){
    mQueueEntry_t entry;

    int count0 = 3;
    int count1=1;
    int count2=2;
    int count3=0;

    labQueue_t * q = (labQueue_t *) pdata;  // Note use of task data..
    printf("Hola Producer\n");
    while (1)
    {
        entry = setDirStep(count0, count1, count2, count3);
        printf("Values after funct call: %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);

        count0++;
        count1++;
        count2++;
        count3++;

        // send a copy of the element and
        switch ( labQueuePut( q, &entry) ){
        case LABQ_OK:
            printf("put %d,%d,%d,%d\n",entry.d[0], entry.d[1], entry.d[2], entry.d[3]);
            break;
        case LABQ_TIMEOUT:
            OSTimeDly(OS_TICKS_PER_SEC/10);
            break;
        case LABQ_FULL:
            OSTimeDly(OS_TICKS_PER_SEC/10);
            break;
        default:
            assert(0);
            break;
        }
        OSTimeDly(1);
      }

}
.

프로그램을위한 화면 출력 :

hola 소비자

Hola 생산자
부서지는 재료 : 1,0,0,0

펑크 통화 후 값 : 235,0,24,23
수신 (1a= 0 : 1b= 1 : 2a= 0 : 2b= 0) 0
235,0,24,23
부서지는 재료 : 0,0,1,0
Funct 호출 후 값 : 236,41,237,0
수신 (1A= 0 : 1B= 0 : 2A= 0 : 2B= 1) 1) 1 236,41,237,0

을 넣으십시오

내 문제는 재료 호출이 동일 할 것으로 예상되는 이후에 BRAING 함수의 값이 동일합니다.

도움이 되었습니까?

해결책

setDirStep()가 값을 반환하지 않고, 아직 mQueueEntry_t를 리턴하는 것으로 선언했습니다.이 할당에서 읽은 값이 유효하지 않습니다.

entry = setDirStep(count0, count1, count2, count3);
.

이렇게하면 컴파일러 경고가 표시되어야합니다. 나는 그것이 놀랐습니다.

오류를 수정하려면 setDirStep()에 필요한 return 문을 추가하십시오.

return entry;
.

미래의 경우 항상 경고가 켜져있는 것으로 컴파일해야합니다.GCC를 사용하는 경우 -Wall가 필요합니다.

코드의 나머지 부분은 확인

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top