Я отдаю себе отчет в том, что тема может быть интересна всего паре человек, но тем не менее, оставлю это тут для поисковых машин.
Короче говоря.
Первое:
В ESP32, с текущими версями toolchain, так делать нельзя:
#include <stdio.h>
// переменная, указатель, для каждого потока - своя.
// хранится на стеке задачи.
//
static __thread char *example_variable = "42";
// функция вызывается до main()
//
static void __attribute__((constructor)) run_before_main() {
example_variable = "43";
}
int main() {
return printf("Value = %s\r\n", example_variable);
}
Все люто повиснет.
Exception while in exception, даже coredump сохранить не может. Красиво грохается, редко такое бывает.
В документации ничего на эту тему нет, и, судя по всему \то фишка именно esp32-gcc и FreeRTOS. Это сильно странно, потому, что можно спокойно создавать и завершать задачи непосредственно в функции-конструкторе. Все кагбэ уже проинициализировано: и память и куча и шедулер. Но тем не менее.
Второе:
Следующий прикол, описание которого, правда, при усердном поиске удалось обнаружить на сайте Espressif
Если у вас определена локальная функция (функция в функции)
void a() {
void b(int i) {
printf("%d\r\n",i);
}
b(1); b(2); b(3); b(4); b(5); b(6);
}
То указатель на такую (внутреннюю) функцию добыть можно, а вот использовать - нет.
Нельзя передать адрес b() куда-то, чтобы вызвать. Проблема связана с тем, как GCC устраивает точку входа в такую функцию. Проблема, насколько я знаю, нерешаемая, но если сильно интересно, поищите в гугле по словам “esp32 gcc trampoline toolchain”