소개
게시글
고민있어요
2023.02.02 19:36
[문의]STM32F Chip 내부의 Flash의 종류는?
- 2
- 1
- 893
고민있어요
2022.09.21 17:00
[문의] Exception Handler 관련
- 1
- 3
- 193
질문&답변
2022.09.21
[질문/해결완료] deferred interrupt 처리에서 portYIELD_FROM_ISR api의 용도
답변 감사합니다. 확인차원에서 재 문의 드립니다.case1: call back에서 portYIELD_FROM_ISR 호출시isr 진입isr 내부에서 call back 함수 호출call back 함수에서 portYIELD_FROM_ISR 호출 (최종 portYIELD 호출되어 portNVIC_INT_CTRL_REG register의 PendSV bit set)isr 중 call back 이후 부분 수행isr 완료xPortPendSVHandler에 의해 context switching 발생case2: call back에서 portYIELD_FROM_ISR 미호출시isr 진입isr 내부에서 call back 함수 호출call back 함수 수행isr 중 call back 이후 부분 수행isr 완료선점 당했던 task로 복귀xPortSysTickHandler에 의해 context switching 발생 결국,Case1은 Case2에서 발생하는 지연 시간 (task로 재 복귀 후, 다음 tick interrupt가 발생하기 까지 시간) 이 발생하지 않는 것으로 이해했습니다. 잘 못 생각하고 있는 부분이 있으면 정정해주세요.
- 1
- 2
- 993
질문&답변
2022.09.16
[질문/해결완료] configUSE_IDLE_HOOK 를 1로 설정하고 동작 시 BusFault exception 발생
문제의 원인은 idle task의 stack overflow로 추정됩니다.혹시 exception 상황에서 stack 분석하는 방법이 정리된 내용이 있으면 공유 부탁 드립니다.내공이 부족하여....: stack size 조절 전idle task의 stack 마지막 위치는 0x200000e4. 정상동작 시에는 stack에 문제 없음(사진)문제 발생 시, idle task의 stack이 변수 영역을 침범하여 exception이 발생하는 것으로 보임(사진)stack 조절freertosconfig_base.h에서 idle stack size를 늘려서 test 해본 결과 정상 동작 확인하였습니다.#define configUSE_TICK_HOOK 0 #define configCPU_CLOCK_HZ ( SystemCoreClock ) #define configTICK_RATE_HZ ((TickType_t)1000) #define configMAX_PRIORITIES ( 20 ) //#define configMINIMAL_STACK_SIZE ((uint16_t)128) //cms: org stack sz #define configMINIMAL_STACK_SIZE ((uint16_t)256) //cms: test #define configTOTAL_HEAP_SIZE ((size_t)15360) #define configMAX_TASK_NAME_LEN ( 16 ) #define configUSE_16_BIT_TICKS 0 #define configUSE_MUTEXES 1 #define configQUEUE_REGISTRY_SIZE 8uart 출력 상황(사진)감사합니다.
- 1
- 2
- 330
질문&답변
2022.09.16
[질문/해결완료] configUSE_IDLE_HOOK를 1로 설정시 기존 task printf 문 동작 불가능
idle hook 함수에서 출력량을 줄여주었더니 아래와 같이 정상 동작합니다.(사진)반영한 source:void vApplicationIdleHook (void) { #if (defined (cms_enable_print_at_idel_hook) && ( cms_enable_print_at_idel_hook == 1)) printf("T1 %d, T2 %d, T3 %d, Idle %d\n", task1timer, task2timer, task3timer, idletimer); #else if(idletimer % 100000 == 0) { printf("."); fflush(stdout); } idletimer++; #endif }
- 1
- 2
- 310