ST20 에서 Task 를 무한 생성하는 방법에 대한 내용을 다루었다.
현재 POD 에서는 3 개의 태스크가 돌아간다고 귀가 따갑게 얘기했다.
각 태스크들은 서로 메세지를 주고 받으면, 유기적으로 동작한다. 하지만, 문제는 언제나 예기치못한 상황에서 발생한다.
POD 가 아닌, 다른 PCMCIA 카드를 넣었을 때, POD 루틴은 그냥 먹통이 되어 버린다.

그래서 생각해낸 것이 바로 오류가 발생했을 때, 각 태스크를 다시 시작 시키는 것이었다.

task_create

다음의 코드를 처럼 테스트를 했다.

for(counter=0; counter < 1000; counter++)
{
 
pPodResetTid = task_create((void (*)(void *))ci_ReseTask, NULL, 2048, 11, "podRESET", 0);
 
 
//pPodResetTid = (task_t*)malloc(sizeof(task_t));
//task_init((void (*)(void *))ci_ReseTask, NULL, pod_stack, STACK_POD, pPodResetTid, &tdepod, 11, "podRESET", 0);
 
//pPodMainTid = task_create((void (*)(void *))ci_MainTask, NULL, 2048, 10, "podMAIN", 0);
 
//podPrevResetMode = 0;
 
task_delay(15600);
//task_resume(pPodResetTid);
 
if(task_kill(pPodResetTid, tstatus, tflags) != 0)
{
	printf("\nKill Error!!\n");
}else{
	printf("\nKill OK!!\n");
}
 
if(task_delete(pPodResetTid) != 0)
{
	printf("\nDelete Error!!\n");
}else{
	printf("\nDelete OK!!\n");
}
 
//free(pPodResetTid);
//pPodResetTid = task_create((void (*)(void *))ci_ReseTask, NULL, 2048, 11, "podRESET", 0);
 
printf("\ncounter_number = %d\n",counter);
 
}

위의 테스트 결과, 정확히 256 번에서 시스템이 뻗었다. 여러가지 이유가 있겠지만, 태스크를 하나 생성할 때마다 늘어나는 스택 메모리가 꽉 차는게 문제인 듯 하다.
그렇다면, 최대 256 번까지 밖에 태스크를 생성하지 못하는 것인가??
이후에 태스크를 2,3,4,5…. 로 늘려서 테스트 해보았다. 태스크를 1 개 늘릴 때마다 루프횟수는 1/2 로 줄어 들었다.

task_init

태스크를 생성하는 다른 방법으로 task_init 가 있다.

for(counter=0; counter < 1000; counter++)
{
 
//pPodResetTid = task_create((void (*)(void *))ci_ReseTask, NULL, 2048, 11, "podRESET", 0);
 
 
pPodResetTid = (task_t*)malloc(sizeof(task_t));
task_init((void (*)(void *))ci_ReseTask, NULL, pod_stack, STACK_POD, pPodResetTid, &tdepod, 11, "podRESET", 0);
 
//pPodMainTid = task_create((void (*)(void *))ci_MainTask, NULL, 2048, 10, "podMAIN", 0);
 
//podPrevResetMode = 0;
 
task_delay(15600);
//task_resume(pPodResetTid);
 
if(task_kill(pPodResetTid, tstatus, tflags) != 0)
{
	printf("\nKill Error!!\n");
}else{
	printf("\nKill OK!!\n");
}
 
if(task_delete(pPodResetTid) != 0)
{
	printf("\nDelete Error!!\n");
}else{
	printf("\nDelete OK!!\n");
}
 
free(pPodResetTid);
//pPodResetTid = task_create((void (*)(void *))ci_ReseTask, NULL, 2048, 11, "podRESET", 0);
 
printf("\ncounter_number = %d\n",counter);
 
}

사용할 때, 주의할 것들이 몇가지 있다. init 의 경우, 자동으로 메모리를 할당하지 않기 때문에 수동으로 메모리를 잡아야 한다.
위의 소스에서 malloc 을 사용한 이유가 바로 이것이다. 테스크 결과, 1000 번이 넘어도 이상없이 잘 동작하였다.

task_exit

일반적으로 생각하기에 exit 라는 것은 빠져나온다는 의미로 쓰인다. 나또한 task_exit 를 사용하면, 수행중인 태스크를 빠져나오는 의미로 알고 있었다. 하지만 몇가지 실험을 통해

결론

task_create 의 경우, 재시작할 필요가 없는 경우에는 사용해도 별 무리가 없지만 POD 와 같이 태스크가 수행도중에 종료되고 다시 재시작이 되어야 하는 태스크의 경우에는 일정 횟수 재시작이 되면 시스템이 그대로 뻗어버린다.
task_create 의 대용으로 task_init 를 사용하는 것이 좋을 것 같다.

  • computer/digitalarena/task_무한_생성하기.txt
  • Last modified: 3 years ago
  • by likewind