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
|
#define configUSE_TICK_HOOK 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef configCPU_CLOCK_HZ
|
#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 )
|
#define configCPU_CLOCK_HZ ( ( unsigned long ) 80000000 )
|
||||||
#endif
|
#endif
|
||||||
#ifndef configTICK_RATE_HZ
|
#ifndef configTICK_RATE_HZ
|
||||||
|
|
|
@ -382,6 +382,10 @@ static __attribute__((noinline)) void user_start_phase2(void) {
|
||||||
|
|
||||||
srand(hwrand()); /* seed libc rng */
|
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
|
// Call gcc constructor functions
|
||||||
void (**ctor)(void);
|
void (**ctor)(void);
|
||||||
for ( ctor = &__init_array_start; ctor != &__init_array_end; ++ctor) {
|
for ( ctor = &__init_array_start; ctor != &__init_array_end; ++ctor) {
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
*
|
*
|
||||||
* This sample code is in the public domain.
|
* This sample code is in the public domain.
|
||||||
*/
|
*/
|
||||||
|
#include <stdlib.h>
|
||||||
#include "espressif/esp_common.h"
|
#include "espressif/esp_common.h"
|
||||||
#include "esp/uart.h"
|
#include "esp/uart.h"
|
||||||
#include "FreeRTOS.h"
|
#include "FreeRTOS.h"
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include "sdk_internal.h"
|
||||||
#ifndef _ESPLIBS_LIBMAIN_H
|
#ifndef _ESPLIBS_LIBMAIN_H
|
||||||
#define _ESPLIBS_LIBMAIN_H
|
#define _ESPLIBS_LIBMAIN_H
|
||||||
|
|
||||||
|
@ -5,6 +6,9 @@
|
||||||
|
|
||||||
// misc.c
|
// misc.c
|
||||||
int sdk_os_get_cpu_frequency(void);
|
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);
|
void sdk_os_update_cpu_frequency(int freq);
|
||||||
|
|
||||||
// user_interface.c
|
// user_interface.c
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "task.h"
|
#include "task.h"
|
||||||
#include "xtensa_ops.h"
|
#include "xtensa_ops.h"
|
||||||
#include "common_macros.h"
|
#include "common_macros.h"
|
||||||
|
#include "esplibs/libmain.h"
|
||||||
|
|
||||||
// xPortSysTickHandle is defined in FreeRTOS/Source/portable/esp8266/port.c but
|
// xPortSysTickHandle is defined in FreeRTOS/Source/portable/esp8266/port.c but
|
||||||
// does not exist in any header files.
|
// 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) {
|
void IRAM sdk__xt_timer_int(void) {
|
||||||
uint32_t trigger_ccount;
|
uint32_t trigger_ccount;
|
||||||
uint32_t current_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 {
|
do {
|
||||||
RSR(trigger_ccount, ccompare0);
|
RSR(trigger_ccount, ccompare0);
|
||||||
|
@ -87,7 +88,7 @@ void IRAM sdk__xt_timer_int1(void) {
|
||||||
void IRAM sdk__xt_tick_timer_init(void) {
|
void IRAM sdk__xt_tick_timer_init(void) {
|
||||||
uint32_t ints_enabled;
|
uint32_t ints_enabled;
|
||||||
uint32_t current_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;
|
||||||
|
|
||||||
RSR(current_ccount, ccount);
|
RSR(current_ccount, ccount);
|
||||||
WSR(current_ccount + ccount_interval, ccompare0);
|
WSR(current_ccount + ccount_interval, ccompare0);
|
||||||
|
|
Loading…
Reference in a new issue