2014-01-10 2 views
1

나는 다음 한 C 문제 : 나는 (마스터로) SPI 버스를 제어하는 ​​하드웨어 모듈, 현실을 부르 자이 SPI_control, 그것은있어 ((static가) & 쓰기 및 Init()WriteRead() 기능 "공개"를 읽어 민간 모르는 사람들을 위해 SPI는 전이중입니다. 즉, 쓰기는 항상 버스에서 데이터를 읽습니다. 이제는 특정 프로토콜을 통합 한 상위 모듈에 액세스 가능하게해야합니다. 상단 모듈을 교정 해 보겠습니다. TDMAC. 두 개의 개별 스레드에서 실행되고 하나는 다른 트랜잭션에 의해 중단되지 않을 수 있습니다 (트랜잭션의 nmiddle에있을 때 먼저 완료해야 함).세마포의 큐 - 심지어 가능합니까?

그래서 내가 생각 하나 가능성은 SPI_ENG 모듈 inbween 및 데이터 흐름을 제어하는 ​​SPI_control을 통합하고 중단 할 수 있는지 알고 무엇을 할 수없는 것입니다 - 그것은 앞으로 데이터 따라 다음 것 spi_control. 하지만 독립적 인 작업을 수행 할 수 있습니까? AC & ** TDMspi_control과 통신 할 수 있습니까? 해당 유형의 ok 세마포 큐에서 쓰고 읽을 수 있습니까? 이것이 어떻게해야합니까?

답변

2

정확히 무엇을 하려는지 명확하게 알 수는 없지만 두 가지 프로세스 (AC 및 TDM)가 자체 출력 대기열에 데이터를 쓸 수 있다는 일반적인 해결책이 있습니다. 세 번째 프로세스는 스케쥴러의 역할을 할 수 있으며이 대기열에서 대안으로 읽고 HW (SPI_control)에 쓸 수 있습니다. 대기열은 버스트 트랜잭션을 처리하기위한 탄력성 버퍼의 역할을하기 때문에 찾고있는 것일 수 있습니다. AC가 TDM을 선점하는 것에 대해 걱정할 필요가없는이 방법을 사용하면 Mutex에서 SPI_Control에 대한 액세스를 동기화 할 필요가 없습니다.

커널의 대기열은 커널 세마포어를 사용하여 구현됩니다. 대기열은 커널 세마포어에 의해 보호되는 메모리 배열입니다.

스케줄러 태스크를위한 제어 msg 대기열을 작성합니다. 이제 시스템에는 3 개의 대기열이 있습니다. AC, TDM 프로세스를위한 2 개의 데이터 출력 대기열과 스케줄러 작업을위한 하나의 제어 대기열. 시스템 시작시 스케줄러 태스크는 AC 및 TDM 전에 시작되어 제어 큐에서 보류됩니다. AC 및 TDM 프로세스는 큐가 공백이 아닌 경우 (msgQNumMsgs()) 때마다 제어 큐를 통해 스케줄러 태스크에 "데이터 사용 가능"msg를 보내야합니다. 이 msg를 수신하면 스케줄러 태스크는 비어있을 때까지 특정 대기열에서 읽기를 시작하고 제어 대기열에서 다시 보류해야합니다. 마지막으로 vxworks (2004)에서 작업하면서 모든 메모리에 모든 글로벌 변수를 액세스 할 수있는 플랫 메모리 모델이있었습니다. 이게 맞습니까? 그렇다면 전역 변수를 사용하여 작업간에 대기열 ID를 전달할 수 있습니다.

1

단순히 각각의 SPI 동작에 뮤텍스를 사용합니다 :

SPI_Read() 
{ 
    MutexGet(&spiMutex); 
    ... 
    MutexPut(&spiMutex); 
} 


SPI_Write() 
{ 
    MutexGet(&spiMutex); 
    ... 
    MutexPut(&spiMutex); 
} 

당신이 필요할 때마다이 우선 순위 반전을 수행 할 수 있도록 우선 순위 상속 뮤텍스가 활성화 초기화 있는지 확인합니다.

+0

뮤텍스 (및 우선 순위 역전 기능)의 출처는 어디입니까? –

+0

@barak manos 감사하지만 이것은 정상적인 전송 완료를 위해 중단되어서는 안되는 프로토콜의 트랜잭션을 처리하지 않습니다. – cerr

+0

왜 안 되니? 뮤텍스를 소유 한 현재 스레드가 완료 될 때까지 SPI에 액세스하려는 스레드는 뮤텍스에 의해 차단됩니다. –