1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-04-22 21:23:07 +03:00

Use F_CPU if (?) CPU frequency switch is compile-time only (#6833)

* At least the F_CPU define in host mock.h is needed by host Arduino.h - need to include Arduino.h further down in mock.h for this to work.

* Geting the include order right

* Prepare for runtime CPU clock rate selection

* Fix compile for not defined F_CPU

If defined F_CPU, make getCpuFreqMHz() a constexpr

* Use defines for register CPU2X instead of hex value

* Fix build for host - getCpuFreqMHz there was also in conflict with getCycleCount, using F_CPU:

tests/host/common/mock.h:#define F_CPU 80000000 (!)

* Asymmetrical includes and defines on host

* Support restart switch from 160MHz to 80MHz, e.g for OTA. Fixes #579
This commit is contained in:
Dirk O. Kaar 2020-04-15 22:15:35 +02:00 committed by GitHub
parent e5f4514847
commit 6cb16997d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 25 additions and 10 deletions

View File

@ -264,11 +264,12 @@ uint8_t EspClass::getBootMode(void)
return system_get_boot_mode(); return system_get_boot_mode();
} }
#ifndef F_CPU
uint8_t EspClass::getCpuFreqMHz(void) uint8_t EspClass::getCpuFreqMHz(void)
{ {
return system_get_cpu_freq(); return system_get_cpu_freq();
} }
#endif
uint32_t EspClass::getFlashChipId(void) uint32_t EspClass::getFlashChipId(void)
{ {

View File

@ -157,7 +157,14 @@ class EspClass {
uint8_t getBootVersion(); uint8_t getBootVersion();
uint8_t getBootMode(); uint8_t getBootMode();
#if defined(F_CPU) || defined(CORE_MOCK)
constexpr uint8_t getCpuFreqMHz() const
{
return clockCyclesPerMicrosecond();
}
#else
uint8_t getCpuFreqMHz(); uint8_t getCpuFreqMHz();
#endif
uint32_t getFlashChipId(); uint32_t getFlashChipId();
uint8_t getFlashChipVendorId(); uint8_t getFlashChipVendorId();
@ -201,6 +208,7 @@ class EspClass {
}; };
#ifndef CORE_MOCK #ifndef CORE_MOCK
uint32_t EspClass::getCycleCount() uint32_t EspClass::getCycleCount()
{ {
return esp_get_cycle_count(); return esp_get_cycle_count();

View File

@ -76,7 +76,7 @@ struct TimeSourceCycles
using timeType = decltype(ESP.getCycleCount()); using timeType = decltype(ESP.getCycleCount());
static timeType time() {return ESP.getCycleCount();} static timeType time() {return ESP.getCycleCount();}
static constexpr timeType ticksPerSecond = F_CPU; // 80'000'000 or 160'000'000 Hz static constexpr timeType ticksPerSecond = ESP.getCpuFreqMHz() * 1000000UL; // 80'000'000 or 160'000'000 Hz
static constexpr timeType ticksPerSecondMax = 160000000; // 160MHz static constexpr timeType ticksPerSecondMax = 160000000; // 160MHz
}; };

View File

@ -81,14 +81,25 @@ void initVariant() __attribute__((weak));
void initVariant() { void initVariant() {
} }
void preloop_update_frequency() __attribute__((weak)); extern "C" void __preloop_update_frequency() {
void preloop_update_frequency() {
#if defined(F_CPU) && (F_CPU == 160000000L) #if defined(F_CPU) && (F_CPU == 160000000L)
REG_SET_BIT(0x3ff00014, BIT(0));
ets_update_cpu_frequency(160); ets_update_cpu_frequency(160);
CPU2X |= 1UL;
#elif defined(F_CPU)
ets_update_cpu_frequency(80);
CPU2X &= ~1UL;
#elif !defined(F_CPU)
if (system_get_cpu_freq() == 160) {
CPU2X |= 1UL;
}
else {
CPU2X &= ~1UL;
}
#endif #endif
} }
extern "C" void preloop_update_frequency() __attribute__((weak, alias("__preloop_update_frequency")));
extern "C" bool can_yield() { extern "C" bool can_yield() {
return cont_can_yield(g_pcont); return cont_can_yield(g_pcont);
} }

View File

@ -118,11 +118,6 @@ uint32_t EspClass::getFreeSketchSpace()
return 4 * 1024 * 1024; return 4 * 1024 * 1024;
} }
uint8_t EspClass::getCpuFreqMHz()
{
return F_CPU / 1000000;
}
const char *EspClass::getSdkVersion() const char *EspClass::getSdkVersion()
{ {
return "2.5.0"; return "2.5.0";