PSoC5LP에서 FreeRTOSv10.2.1을 사용한 L 치카
환경
프로젝트 만들기
PSoC Creator를 시작하고 File->New->Project에서 프로젝트를 만든다.
디바이스는 이번에 이용하는 CY8C5888LTI-LP097을 선택.
템플릿은 빈 empty를 선택.
알기 쉬운 이름과 디렉토리를 지정해 Finish 한다.
FreeRTOS 도입
다운로드
FreeRTOS 부터 다운로드 가능.
2019/6/10 시점에서 최신 ver는 10.2.1.
zip과 exe가 있지만 이번에는 zip을 선택.
소개
zip을 압축 해제하면 여러 폴더가 생성됩니다. 이 중 Demo 폴더는 각 마이크로 컴퓨터용 데모 폴더, License는 라이센스가 들어 있다. 이번 사용하는 Source만을 프로젝트의 디렉토리에 복사한다.
PSoC Creator에 링크
우선 알기 쉽게 디자인 내에 FreeRTOS용 폴더를 생성한다.
복사한 파일을 이 폴더내에 링크해 간다.
필요한 것을 열거하면,
다운로드
FreeRTOS 부터 다운로드 가능.
2019/6/10 시점에서 최신 ver는 10.2.1.
zip과 exe가 있지만 이번에는 zip을 선택.
소개
zip을 압축 해제하면 여러 폴더가 생성됩니다. 이 중 Demo 폴더는 각 마이크로 컴퓨터용 데모 폴더, License는 라이센스가 들어 있다. 이번 사용하는 Source만을 프로젝트의 디렉토리에 복사한다.
PSoC Creator에 링크
우선 알기 쉽게 디자인 내에 FreeRTOS용 폴더를 생성한다.
복사한 파일을 이 폴더내에 링크해 간다.
필요한 것을 열거하면,
을 각각 Header Files와 Source Files에 드래그 앤 드롭으로 링크한다.
FreeRTOS 구성 파일 만들기
FreeRTOS의 설정용 헤더 파일을 작성한다.
해동해 생긴 FreeRTOS/Demo/CORTEX_CY8C5588_PSoC_Creator_GCC/FreeRTOS_Demo.cydsn 디렉토리의 FreeRTOSConfig.h와 device.h를 복사해 가져오는 것이 빠르다.
FreeRTOSConfig.h는 FreeRTOS의 설정 파일, device.h는 project.h의 래퍼가 되어 있다. 필자의 경우 어색했기 때문에 device.h는 카피해 오지 않고 FreeRTOSConfig.h내의 기술을 만져 직접 project.h를 포함하는 형태로 했다.
복사해 가면 잊지 않고 PSoC Creator에 링크해 둔다.
PSoC Creator에 포함 경로 지정
PSoC Creator 메뉴 바의 Project->Build Setting에서 ARM_GCC~->Compiler->General의 Additional Include Directories에 FreeRTOS의 헤더 파일이 존재하는 디렉토리를 지정해 준다.
portable/GCC/ARM_CM3가 잊기 쉽기 때문에 주의할 것.
이상으로 FreeRTOS의 최소한의 도입은 끝납니다.
L치카하다
Top Design/Pin 할당
이번은 단지 L 치카이므로 Digital Output 핀을 하나 두는 것만.
핀 할당은 개발 보드 사용자 LED와 연결된 2.1 핀을 지정한다.
프로그램
프로그램은 다음과 같다.
main.c#include "project.h"
#include "FreeRTOS.h"
#include "task.h"
void vTestTask1();//タスクとして走らせる関数
void vTestTask2();
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
//FreeRTOS用の割り込み周りの初期設定。この処理をしないと動かない。
extern void xPortPendSVHandler( void );
extern void xPortSysTickHandler( void );
extern void vPortSVCHandler( void );
extern cyisraddress CyRamVectors[];
CyRamVectors[ 11 ] = ( cyisraddress ) vPortSVCHandler;
CyRamVectors[ 14 ] = ( cyisraddress ) xPortPendSVHandler;
CyRamVectors[ 15 ] = ( cyisraddress ) xPortSysTickHandler;
//タスクを生成
xTaskCreate(vTestTask1,"test1",100,NULL,3,NULL);
xTaskCreate(vTestTask2,"test2",100,NULL,3,NULL);
//スケジューラを起動
vTaskStartScheduler();
for(;;)
{
/* Place your application code here. */
}
}
//LEDを点灯させるタスク
void vTestTask1(){
for(;;){
vTaskDelay(1000);
LED_1_Write(1);
}
}
//LEDを消灯させるタスク
void vTestTask2(){
vTaskDelay(500);
for(;;){
vTaskDelay(1000);
LED_1_Write(0);
}
}
//オーバーフローが起こった際のハンドラ
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
{
/* The stack space has been execeeded for a task, considering allocating more. */
taskDISABLE_INTERRUPTS();
}/*---------------------------------------------------------------------------*/
//メモリの確保に失敗したときのハンドラ
void vApplicationMallocFailedHook( void )
{
/* The heap space has been execeeded. */
taskDISABLE_INTERRUPTS();
}
FreeRTOS는 xTaskCreate();
함수로 태스크로 실행할 함수를 지정하여 태스크를 생성하고 vTaskStartScheduler();
함수로 스케줄러를 시작하여 생성된 태스크를 실행할 수 있습니다.
xTaskCreate();
함수의 인수는 1 항목으로부터, 달리는 함수, 태스크명, 스택 사이즈, 태스크에 건네주는 인수, 우선도, 태스크의 ID가 되어 있다.
이번에는 testTask1로 LED를 점등시켜 testTask2로 소등시키는 프로그램으로 했다. testTask2 쪽은 500ms의 딜레이를 넣고 있으므로, 1Hz의 L치카가 되어 있을 것이지만, 동기를 잡지 않기 때문에 어긋날 가능성도 있다.
무사 컴파일이 쓰고 성공하면 0.5초마다 LED가 치카치카 할 것이다.
이 L치카는 FreeRTOS의 (아마) 최소 구성이므로, 다른 기능을 시험하고 싶은 경우는 데모가 참고가 된다.
Reference
이 문제에 관하여(PSoC5LP에서 FreeRTOSv10.2.1을 사용한 L 치카), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Tanba28/items/373f6ab8ef21a4cd964b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include "project.h"
#include "FreeRTOS.h"
#include "task.h"
void vTestTask1();//タスクとして走らせる関数
void vTestTask2();
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
//FreeRTOS用の割り込み周りの初期設定。この処理をしないと動かない。
extern void xPortPendSVHandler( void );
extern void xPortSysTickHandler( void );
extern void vPortSVCHandler( void );
extern cyisraddress CyRamVectors[];
CyRamVectors[ 11 ] = ( cyisraddress ) vPortSVCHandler;
CyRamVectors[ 14 ] = ( cyisraddress ) xPortPendSVHandler;
CyRamVectors[ 15 ] = ( cyisraddress ) xPortSysTickHandler;
//タスクを生成
xTaskCreate(vTestTask1,"test1",100,NULL,3,NULL);
xTaskCreate(vTestTask2,"test2",100,NULL,3,NULL);
//スケジューラを起動
vTaskStartScheduler();
for(;;)
{
/* Place your application code here. */
}
}
//LEDを点灯させるタスク
void vTestTask1(){
for(;;){
vTaskDelay(1000);
LED_1_Write(1);
}
}
//LEDを消灯させるタスク
void vTestTask2(){
vTaskDelay(500);
for(;;){
vTaskDelay(1000);
LED_1_Write(0);
}
}
//オーバーフローが起こった際のハンドラ
void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName )
{
/* The stack space has been execeeded for a task, considering allocating more. */
taskDISABLE_INTERRUPTS();
}/*---------------------------------------------------------------------------*/
//メモリの確保に失敗したときのハンドラ
void vApplicationMallocFailedHook( void )
{
/* The heap space has been execeeded. */
taskDISABLE_INTERRUPTS();
}
Reference
이 문제에 관하여(PSoC5LP에서 FreeRTOSv10.2.1을 사용한 L 치카), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Tanba28/items/373f6ab8ef21a4cd964b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)