이제 CM과 통신을 해보자.
CM에서는 EtherCAT의 PDO 또는 SDO로 통신한다.
이를 위해 주기적으로 CPU에 데이터(오브젝트)를 교환해야 한다.
데이터 교환을 위해 IPC 통신을 사용한다.
이번 포스팅에서는 IPC 통신으로 LED를 온/오프 하기 위한 카운트를 주고 받아 LED를 제어할 것이다.
CM에서 카운트를 증가하고, 일정 카운트에 도달하면 CPU1에 LED 토글 명령을 전송한다.
CPU1에서는 토글 명령에 따라 LED를 제어하고, 완료 신호를 CM에 전송한다.
1. RAM 영역 설명
2. 코드 구조
3. 결과
CPU와 CM의 읽고 쓰기 가능한 RAM 영역이 있다.
그림 1을 보면, CPU1와 CPU2, CM간 데이터 교환을 위한 RAM 영역이 선언되어 있다.
예시를 들어보자.
CPU1의 입장에서 설명한다.
CM으로 데이터를 보내고 싶다면 CPU1TOCMRAM 영역에 데이터를 써주면 된다.
반대로 CM에서 데이터를 읽어오고 싶다면 CMTOCPU1RAM 영역의 데이터를 읽어오면 된다.
그렇다. RAM 영역의 데이터에 동시 접근하는 구조가 아니다.
다만 주의할 점은 데이터를 주고 받을 것이기에 데이터 구조가 동일해야 한다.
그림 2를 보자.
CPU1에서 주고받은 데이터의 구조체 선언을 그림 2와 같이 했다고 가정하면,
CM에서도 동일한 구조체 형식을 사용하는 것이 좋다.
변수 이름은 다를 수 있겠지만 데이터의 크기는 맞출 필요가 있다.
변수 이름을 보면 알 수 있듯이 CM으로 보낼 구조체 변수와 CM에서 불러들일 구조체 변수를 선언했다.
CM에서 불러들일 구조체 변수를 복사해서 사용하기 위한 구조체 변수( read_data_CPU1)도 선언했다.
(써도 되고 안 써도 된다.)
그리고 LED를 제어하기 위한 2개의 태스크를 선언했다.
CM으로부터 토글 명령이 들어오면, LED를 토글하고 '토글 명령을 초기화하는 신호'를 1로 만든다.
CM에서 구조체 선언 및 ram 영역 선언하는 것은 생략한다.
위의 코드를 본다면 충분히 혼자서 가능할 것이다.
(cmd 파일을 조금 손봐야 할 수도 ㅎㅎ)
CPU1로부터 카운트 초기화 신호가 도착하면, 토글 명령을 초기화하고 카운트를 일정 값으로 초기화한다.
카운트값이 감소하다가 0이 되면 LED 토글 명령을 전송한다.
LED D1은 1초마다 토글하고, LED D2는 2초마다 토글한다.
그런데, 시간이 조금 흐르면 LED의 토글 타이밍이 조금 어긋날 것이다.
IPC 동기화 기능을 사용하고, 태스크 1개에서 처리하면 LED 제어 타이밍이 잘 맞을것이다.
하지만, 연습삼아 하는거니까 태스크를 나누었다.
디버깅 모드에 진입하면 카운트를 계속 증가하는 거을 볼 수 있다.
그리고 RAM 주소 또한 그림 1에서 설정한대로 지정되어 있다.
상단 메뉴에서 [View] - Memory Browser] 를 클릭해보자.
실제 메모리에 변수가 어떻게 할당되어 있는지 보여준다.
그림 6와 동일하게 0x00038000에 IPC_RxFromCM 이 할당되어 있고, 카운트가 계속 바뀌는 것을 볼 수 있다.
[TMS320F28388D] SYS/BIOS 10부 - Semaphore (0) | 2023.12.26 |
---|---|
[TMS320F28388D] SYS/BIOS 9부 - Task (2) | 2023.12.26 |
[TMS320F28388D] SYS/BIOS 7부 - CLA 생성하기 with Hwi & Task (0) | 2023.09.02 |
[TMS320F28388D] SYS/BIOS 6부 - CLA 생성하기 + 되새김 (0) | 2023.08.28 |
[TMS320F28388D] SYS/BIOS 5부 - Hwi 생성하기 (0) | 2023.08.19 |