mirror of
				https://github.com/espressif/esp-idf.git
				synced 2025-11-04 09:01:40 +01:00 
			
		
		
		
	
		
			
	
	
		
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								 Test of FreeRTOS "legacy" hook functions, and delete hook
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 Only compiled in if the relevant options are enabled.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								#include <stdio.h>
							 | 
						||
| 
								 | 
							
								#include <stdlib.h>
							 | 
						||
| 
								 | 
							
								#include "freertos/FreeRTOS.h"
							 | 
						||
| 
								 | 
							
								#include "freertos/task.h"
							 | 
						||
| 
								 | 
							
								#include <freertos/semphr.h>
							 | 
						||
| 
								 | 
							
								#include "driver/timer.h"
							 | 
						||
| 
								 | 
							
								#include "unity.h"
							 | 
						||
| 
								 | 
							
								#include "test_utils.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if CONFIG_FREERTOS_LEGACY_HOOKS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static volatile unsigned idle_count;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void vApplicationIdleHook(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    idle_count++;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TEST_CASE("legacy idle hook is correctly called based on config", "[freertos]")
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    idle_count = 0;
							 | 
						||
| 
								 | 
							
								    vTaskDelay(10);
							 | 
						||
| 
								 | 
							
								    TEST_ASSERT_NOT_EQUAL(0, idle_count); // The legacy idle hook should be called at least once
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static volatile unsigned tick_count;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void IRAM_ATTR vApplicationTickHook(void)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    tick_count++;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TEST_CASE("legacy tick hook is called based on config", "[freertos]")
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    unsigned before = xTaskGetTickCount();
							 | 
						||
| 
								 | 
							
								    const unsigned SLEEP_FOR = 20;
							 | 
						||
| 
								 | 
							
								    tick_count = before;
							 | 
						||
| 
								 | 
							
								    vTaskDelay(SLEEP_FOR);
							 | 
						||
| 
								 | 
							
								    TEST_ASSERT_UINT32_WITHIN_MESSAGE(3 * portNUM_PROCESSORS, before + SLEEP_FOR * portNUM_PROCESSORS, tick_count,
							 | 
						||
| 
								 | 
							
								                                      "The legacy tick hook should have been called approx 1 time per tick per CPU");
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // CONFIG_FREERTOS_LEGACY_HOOKS
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#if CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static volatile void *deleted_tcb;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static void taskDeletesItself(void *ignored)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    vTaskDelete(NULL);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void vPortCleanUpTCB(void *pxTCB)
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    deleted_tcb = pxTCB;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								TEST_CASE("static task cleanup hook is called based on config", "[freertos]")
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    for(int i = 0; i < portNUM_PROCESSORS; i++) {
							 | 
						||
| 
								 | 
							
								        printf("Creating task CPU %d\n", i);
							 | 
						||
| 
								 | 
							
								        TaskHandle_t new_task = NULL;
							 | 
						||
| 
								 | 
							
								        deleted_tcb = NULL;
							 | 
						||
| 
								 | 
							
								        xTaskCreatePinnedToCore(taskDeletesItself, "delete", 2048, NULL, UNITY_FREERTOS_PRIORITY, &new_task, i);
							 | 
						||
| 
								 | 
							
								        vTaskDelay(5);
							 | 
						||
| 
								 | 
							
								        TEST_ASSERT_EQUAL_PTR(deleted_tcb, new_task); // TCB & TaskHandle are the same in FreeRTOS
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#endif // CONFIG_FREERTOS_ENABLE_STATIC_TASK_CLEAN_UP
							 |