Honour values of configCPU_CLOCK_HZ & configTICK_RATE_HZ for tick rate
Fixes #147 * Can vary tick rate from 100Hz via configTICK_RATE_HZ. Note that the SDK binary libraries are hard-coded to assume the tick rate is 100Hz, so changing the tick rate may have unexpected consequences for lower layer WiFi behaviour (such as certain kinds of timeouts happening faster/slower.) * Setting configCPU_CLOCK_HZ to 160MHz means ESP will set 160MHz during initialisation. Only 80MHz and 160MHz are supported. * Timing of tasks is no longer affected by current CPU freq (whether set via configCPU_CLOCK_HZ or via sdk_system_update_cpu_freq().) Previously doubling the CPU frequency would double the tick rate.
This commit is contained in:
		
							parent
							
								
									701a4c4284
								
							
						
					
					
						commit
						678b59babf
					
				
					 5 changed files with 19 additions and 2 deletions
				
			
		|  | @ -34,6 +34,13 @@ | |||
| #define configUSE_TICK_HOOK			0 | ||||
| #endif | ||||
| #ifndef configCPU_CLOCK_HZ | ||||
| /* This is the _default_ clock speed for the CPU. Can be either 80MHz
 | ||||
|  * or 160MHz, and the system will set the clock speed to match at startup. | ||||
| 
 | ||||
| Note that it's possible to change the clock speed at runtime, so you | ||||
| can/should use sdk_system_get_cpu_frequency() in order to determine the | ||||
| current CPU frequency, in preference to this macro. | ||||
| */ | ||||
| #define configCPU_CLOCK_HZ			( ( unsigned long ) 80000000 ) | ||||
| #endif | ||||
| #ifndef configTICK_RATE_HZ | ||||
|  |  | |||
|  | @ -382,6 +382,10 @@ static __attribute__((noinline)) void user_start_phase2(void) { | |||
| 
 | ||||
|     srand(hwrand()); /* seed libc rng */ | ||||
| 
 | ||||
|     // Set intial CPU clock speed to 160MHz if necessary
 | ||||
|     _Static_assert(configCPU_CLOCK_HZ == 80000000 || configCPU_CLOCK_HZ == 160000000, "FreeRTOSConfig must define initial clock speed as either 80MHz or 160MHz"); | ||||
|     sdk_system_update_cpu_freq(configCPU_CLOCK_HZ / 1000000); | ||||
| 
 | ||||
|     // Call gcc constructor functions
 | ||||
|     void (**ctor)(void); | ||||
|     for ( ctor = &__init_array_start; ctor != &__init_array_end; ++ctor) { | ||||
|  |  | |||
|  | @ -2,6 +2,7 @@ | |||
|  * | ||||
|  * This sample code is in the public domain. | ||||
|  */ | ||||
| #include <stdlib.h> | ||||
| #include "espressif/esp_common.h" | ||||
| #include "esp/uart.h" | ||||
| #include "FreeRTOS.h" | ||||
|  |  | |||
|  | @ -1,3 +1,4 @@ | |||
| #include "sdk_internal.h" | ||||
| #ifndef _ESPLIBS_LIBMAIN_H | ||||
| #define _ESPLIBS_LIBMAIN_H | ||||
| 
 | ||||
|  | @ -5,6 +6,9 @@ | |||
| 
 | ||||
| // misc.c
 | ||||
| int sdk_os_get_cpu_frequency(void); | ||||
| 
 | ||||
| /* Don't call this function from user code, it doesn't change the CPU
 | ||||
|  * speed. Call sdk_system_update_cpu_freq() instead. */ | ||||
| void sdk_os_update_cpu_frequency(int freq); | ||||
| 
 | ||||
| // user_interface.c
 | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
| #include "task.h" | ||||
| #include "xtensa_ops.h" | ||||
| #include "common_macros.h" | ||||
| #include "esplibs/libmain.h" | ||||
| 
 | ||||
| // xPortSysTickHandle is defined in FreeRTOS/Source/portable/esp8266/port.c but
 | ||||
| // does not exist in any header files.
 | ||||
|  | @ -66,7 +67,7 @@ void IRAM sdk__xt_int_exit(void) { | |||
| void IRAM sdk__xt_timer_int(void) { | ||||
|     uint32_t trigger_ccount; | ||||
|     uint32_t current_ccount; | ||||
|     uint32_t ccount_interval = portTICK_RATE_MS * 80000; //FIXME
 | ||||
|     uint32_t ccount_interval = portTICK_RATE_MS * sdk_os_get_cpu_frequency() * 1000; | ||||
| 
 | ||||
|     do { | ||||
|         RSR(trigger_ccount, ccompare0); | ||||
|  | @ -87,7 +88,7 @@ void IRAM sdk__xt_timer_int1(void) { | |||
| void IRAM sdk__xt_tick_timer_init(void) { | ||||
|     uint32_t ints_enabled; | ||||
|     uint32_t current_ccount; | ||||
|     uint32_t ccount_interval = portTICK_RATE_MS * 80000; //FIXME
 | ||||
|     uint32_t ccount_interval = portTICK_RATE_MS * sdk_os_get_cpu_frequency() * 1000; | ||||
| 
 | ||||
|     RSR(current_ccount, ccount); | ||||
|     WSR(current_ccount + ccount_interval, ccompare0); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue