[TMS320F28335 EVM] TI 무료 RTOS SYSBIOS 테스트
TI에서 제공하는 무료 RTOS인 SYSBIOS를 TMS320F28시리즈(TMS320F28335)에서 테스트 해보았다. 이번에는 기존 SYSBIOS 테스트 예제 에 추가하여세마포를 이용하여 쓰레드를 처리하는 예제를 테스트 했다.
SYSBIOS 프로젝트 생성
CCS4.0 이상에서 (예제는 CCS5에서 테스트 했다.) 에서 SYSBIOS 프로젝트 생성시 지원 가능하다.
CCS 프로젝트 생성시 SYSBIOS 항목에서 적당한 탬플릿을 선택하면 간단히 적용할 수 있다.
RTOS 버전 설정
SYSBIOS 등록 후 cfg파일에서 SYS/BIOS관련 각종 파라미터들을 쉽게 설정 할 수 있다.
SYSBIOS 구조
SYSBIOS 기본 골격
기본 환경 설정이 마무리 되었기 때문에 간단한 예제를 작성하여 테스트 해보자.
TASK 설정 및 추가를 위한 cfg 파일 수정
TASK 실행
cfg파일에서 정의한 TASK를 실행할 함수를 아래과 같이 작성해 준다. 아래 예제는 단순히 루프를 돌며 대기하다 세마포 이벤트가 발생하면 LED깜박이고 UART로 값을 출력하는 예제이다. 세마포 이벤트는 일정 간격으로 타이머 Task에서 호출하도록 했다.
예제를 실행하면 두개의 TASK가 원하는 시간에 동작되는 것을 LED및 UART를 통해 확인 할 수 있다.
Task1=41
Task2=418
Task2=419
Task2=420
Task2=421
Task2=422
Task2=423
Task2=424
Task2=425
Task2=426
Task2=427
Task1=42
Task2=428
Task2=429
Task2=430
Task2=431
Task2=432
Task2=433
Task2=434
Task2=435
Task2=436
Task2=437
Task1=43
결론
RTOS는 사용의 편리성 보다는 초기 설정이나 MCU별 포팅에 대한 문제 때문에 부담이 많이 가는것이 현실이다.
TI에서 제공되는 SYS/BIOS는 TI의 대부분 MCU를 지원하고 간단히 설정 가능하므로 여러가지 장점이 많다. 한번 설정 해 두면 앞으로 도움이 많이 될것 같다.
TI에서 제공하는 무료 RTOS인 SYSBIOS를 TMS320F28시리즈(TMS320F28335)에서 테스트 해보았다. 이번에는 기존 SYSBIOS 테스트 예제 에 추가하여세마포를 이용하여 쓰레드를 처리하는 예제를 테스트 했다.
SYSBIOS 프로젝트 생성
CCS4.0 이상에서 (예제는 CCS5에서 테스트 했다.) 에서 SYSBIOS 프로젝트 생성시 지원 가능하다.
CCS 프로젝트 생성시 SYSBIOS 항목에서 적당한 탬플릿을 선택하면 간단히 적용할 수 있다.
RTOS 버전 설정
SYSBIOS 등록 후 cfg파일에서 SYS/BIOS관련 각종 파라미터들을 쉽게 설정 할 수 있다.
SYSBIOS 구조
SYSBIOS 기본 골격
#include <xdc/std.h>
#include <xdc/runtime/Log.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Semaphore.h>
#include "system.h"
#include "serial.h"
/* Counter incremented by timer interrupt */
volatile UInt tickCount = 0;
volatile UInt tickCount2 = 0;
//세마포 생성
extern const Semaphore_Handle mySem;
extern const Semaphore_Handle mySem2;
Void main()
{
//사용자 초기화 함수
//--------------------------------------------------------
SystemInit();
Led1Init();
Led1On();
Led2Init();
Led2Off();
//Serial Init
DebugInit(BAUD_115200);
DebugPrint("SYS/BIOS Test Program.\r\n");
//--------------------------------------------------------
//--------------------------------------------------------
//Start RTOS BIOS
BIOS_start();
//--------------------------------------------------------
}
//수행될 TASK 함수
Void myTaskFxn(Void)
{
wihle(1)
{
:
}
}
Void myTaskFxn2(Void)
{
wihle(1)
{
:
}
}
#include <xdc/runtime/Log.h>
#include <ti/sysbios/BIOS.h>
#include <ti/sysbios/knl/Semaphore.h>
#include "system.h"
#include "serial.h"
/* Counter incremented by timer interrupt */
volatile UInt tickCount = 0;
volatile UInt tickCount2 = 0;
//세마포 생성
extern const Semaphore_Handle mySem;
extern const Semaphore_Handle mySem2;
Void main()
{
//사용자 초기화 함수
//--------------------------------------------------------
SystemInit();
Led1Init();
Led1On();
Led2Init();
Led2Off();
//Serial Init
DebugInit(BAUD_115200);
DebugPrint("SYS/BIOS Test Program.\r\n");
//--------------------------------------------------------
//--------------------------------------------------------
//Start RTOS BIOS
BIOS_start();
//--------------------------------------------------------
}
//수행될 TASK 함수
Void myTaskFxn(Void)
{
wihle(1)
{
:
}
}
Void myTaskFxn2(Void)
{
wihle(1)
{
:
}
}
TASK 설정 및 추가를 위한 cfg 파일 수정
var BIOS = xdc.useModule('ti.sysbios.BIOS');
BIOS.swiEnabled = false;
BIOS.taskEnabled = true;
BIOS.clockEnabled = false;
/* Create a task with priority 1 */
var Task = xdc.useModule('ti.sysbios.knl.Task');
var taskParams = new Task.Params();
taskParams.priority = 1;
var myTask = Task.create('&myTaskFxn', taskParams);
var myTask2 = Task.create('&myTaskFxn2', taskParams);
/* Inhibit the creation of a task to run idle functions */
Task.enableIdleTask = false;
BIOS.swiEnabled = false;
BIOS.taskEnabled = true;
BIOS.clockEnabled = false;
/* Create a task with priority 1 */
var Task = xdc.useModule('ti.sysbios.knl.Task');
var taskParams = new Task.Params();
taskParams.priority = 1;
var myTask = Task.create('&myTaskFxn', taskParams);
var myTask2 = Task.create('&myTaskFxn2', taskParams);
/* Inhibit the creation of a task to run idle functions */
Task.enableIdleTask = false;
TASK 실행
cfg파일에서 정의한 TASK를 실행할 함수를 아래과 같이 작성해 준다. 아래 예제는 단순히 루프를 돌며 대기하다 세마포 이벤트가 발생하면 LED깜박이고 UART로 값을 출력하는 예제이다. 세마포 이벤트는 일정 간격으로 타이머 Task에서 호출하도록 했다.
//RTOS TASK1 - BIOS_start() thread.
Void myTaskFxn(Void)
{
while (TRUE)
{
//세마포 핸들에 의해 호출 되기전 까지 대기
Semaphore_pend(mySem, BIOS_WAIT_FOREVER);
Led1Toggle();
DebugPrint("Task1=%d\r\n", tickCount);
}
}
//RTOS Task2
Void myTaskFxn2(Void)
{
while(1)
{
//세마포 핸들에 의해 호출 되기전 까지 대기
Semaphore_pend(mySem2, BIOS_WAIT_FOREVER);
Led2Toggle();
test_cnt2++;
DebugPrint("Task2=%d\r\n", test_cnt2);
}
}
Void myTaskFxn(Void)
{
while (TRUE)
{
//세마포 핸들에 의해 호출 되기전 까지 대기
Semaphore_pend(mySem, BIOS_WAIT_FOREVER);
Led1Toggle();
DebugPrint("Task1=%d\r\n", tickCount);
}
}
//RTOS Task2
Void myTaskFxn2(Void)
{
while(1)
{
//세마포 핸들에 의해 호출 되기전 까지 대기
Semaphore_pend(mySem2, BIOS_WAIT_FOREVER);
Led2Toggle();
test_cnt2++;
DebugPrint("Task2=%d\r\n", test_cnt2);
}
}
예제를 실행하면 두개의 TASK가 원하는 시간에 동작되는 것을 LED및 UART를 통해 확인 할 수 있다.
Task1=41
Task2=418
Task2=419
Task2=420
Task2=421
Task2=422
Task2=423
Task2=424
Task2=425
Task2=426
Task2=427
Task1=42
Task2=428
Task2=429
Task2=430
Task2=431
Task2=432
Task2=433
Task2=434
Task2=435
Task2=436
Task2=437
Task1=43
결론
RTOS는 사용의 편리성 보다는 초기 설정이나 MCU별 포팅에 대한 문제 때문에 부담이 많이 가는것이 현실이다.
TI에서 제공되는 SYS/BIOS는 TI의 대부분 MCU를 지원하고 간단히 설정 가능하므로 여러가지 장점이 많다. 한번 설정 해 두면 앞으로 도움이 많이 될것 같다.
반응형