지난 시간까지 작성한 코드에 이어서 CLA 를 넣어보려 하다가 뭔가 꼬여버렸다
그래서 CLA만 코드로 작성하고 나서 나머지 기능을 차근차근 넣어보려 한다.
복습하는 셈 치고
(CLA 코드만 보실 분은 스크롤을 내려주세요)
(스크롤 압박있습니다)
할 게 많으니 프로젝트 생성하는 것부터 빠르게 넘어가본다.
우리의 목표는 다음과 같다.
인터럽트가 없는 상태에서 Task만 실행했을 때, Task 실행 횟수와 CLA 실행 횟수가 동일한지 비교한다.
또한, cmd 파일을 별도로 만들어서 진행해본다.
프로젝트 생성은 다음 순서로 진행한다.
1. SYS/BIOS로 프로젝트 생성(생략)
2. 라이브러리 폴더 추가
3. 프로젝트 설정
4. 라이브러리 폴더에서 파일 수정 및 삭제
5. cmd 파일 및 cfg 파일 설정
필요한 파일을 복사해온다.
라이브러리가 필요한데 driverlib, common, headers 총 3개가 필요하다.
C:\ti\c2000\C2000Ware_5_00_00_00\driverlib\f2838x
→ driverlib 폴더 그대로 복사
C:\ti\c2000\C2000Ware_5_00_00_00\device_support\f2823x
→ common 폴더에서는 include와 source 폴더만 복사한다.
단, TargetConfigs 폴더와 2838x_FLASH_CLA_lnk_cpu1.cmd는 편의상 core_CPU1 폴더 아래로 복사한다.
headers 폴더는 cmd 폴더만 빼고 복사하는데, cmd 폴더에서 f2838x_headers_BIOS_cpu1.cmd만 core_CPU1 폴더 아래로 복사한다.
복사해오면 그림 1과 같이 될 것이다.
기본으로 생성된 cmd 파일은 참고용으로 놔두자. Exclude from Build 해준다.
이제 프로젝트 설정을 변경해주자.
이전까지의 글을 읽었다면 설명이 없어도 될 것이라 생각하여 설명은 패스한다.
이제 common 폴더를 열어보자.
common/source 폴더에서 f2838x_codestartbranch.asm, startup_cm.c, f2838x_swprioritizedpievect.c, cm.c를 삭제한다.
그리고 common/include 폴더에서 cm.h, driverlib_cm.h를 삭제한다.
여기까지 진행했다면 에러가 2개 있을텐데, cmd 파일과 cfg 파일을 수정하면 해결된다.
먼저 cmd 파일부터 보자.
아마 RAMLS0_5가 없어서 발생하는 에러일텐데, cmd 파일을 보면 RAMLS5가 사용중이다.
CLA나 다른 데서 RAMLS5를 사용할 예정이므로, RAMLS0_5를 바꿔줘야 한다.
편하게 RAMLS0_4를 해도 되고, RAMLS0_2로 해도 좋다.
이 것 외에 cmd 파일에서 수정해야 할 부분이 많은데, 스스로 해보자.
자, 프로젝트 생성이 끝났다.
CLA1를 실행해보자.
TI에서 제공해주는 예제 파일을 가져올 것이다.
이전과는 다르게 RAM 영역을 설정해줘야 해서 처음에 조금 어려울 수 있다.
예제코드를 이것저것 붙여보면서 동작하는지 확인하는 것도 하나의 방법이다.
나는 2개의 예제 코드를 참고해서 동작 코드를 만들었다.
아래 경로를 참고한다.
C:\ti\c2000\C2000Ware_5_00_00_00\device_support\f2838x\examples\cpu1\cla\cla_ex1_asin.c
→ CLA_initCpu1Cla1()
C:\ti\c2000\C2000Ware_5_00_00_00\device_support\f2838x\examples\cpu1\cla\cla_ex3_background_task.c
→ CLA_configClaMemory()
CLA를 실행하기 위한 단계를 해보겠다.
1. Task에서 CLA 호출하기 → 실행 안됨
한번 스스로 해보자. CLA는 인터럽트에서 동작하는 것으로 보인다.
CLA를 호출할 때는 CLA_forceTasks를 사용한다.
함수의 첫 번째 인자는는 핸들러이고, 두 번째 인자는 플래그이다.
플래그로 CLA_TASKFLAG_1을 넣으면, *.cla에 정의된 Cla1Task1() 함수가 실행된다.
2. Timer에서 CLA를 호출하기 → 실행 가능
TaskA는 100ms마다 실행되고, TimerA는 1ms마다 실행되며 CLA를 호출한다.
그림 7을 보면 알 수 있다.
그런데, CLA와 Timer의 실행 횟수가 다르다.
디버깅모드에서 pause해놓고 보면 동일하다.
3. TimerA() → Swi → CLA1 (정상동작)
4. TaskA() → Swi → CLA1 (정상동작)
아까는 Task에서 직접 CLA를 호출했는데, 이번에는 Swi를 중간에 넣어보았다.
이렇게 하면 CLA를 실행할 수 있다.
이렇듯, Task가 아닌 Interrupt나 Timer에서 CLA를 호출해야 함을 알 수 있다.
[TMS320F28388D] SYS/BIOS 8부 - CPU1와 CM의 IPC 통신 (0) | 2023.12.21 |
---|---|
[TMS320F28388D] SYS/BIOS 7부 - CLA 생성하기 with Hwi & Task (0) | 2023.09.02 |
[TMS320F28388D] SYS/BIOS 5부 - Hwi 생성하기 (0) | 2023.08.19 |
[TMS320F28388D] SYS/BIOS 4부 - Timer 생성하기 (2) | 2023.08.19 |
[TMS320F28388D] SYS/BIOS 3부 - Swi 생성하기 (0) | 2023.08.19 |