IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> ESP32-S2系统加固实践(一) -> 正文阅读

[嵌入式]ESP32-S2系统加固实践(一)

LoRa网关功能调试完成了,需要加固,测试。

(1)看门狗

参考ESP32学习笔记(40)——Watchdog看门狗使用 - 简书

ESP-IDF 支持两种类型的看门狗:中断看门狗定时器和任务看门狗定时器(TWDT)。中断看门狗定时器和 TWDT 都可以使用项目配置菜单启用,但是 TWDT 也可以在运行时启用。中断看门狗负责检测 FreeRTOS 任务切换被长时间阻塞的情况。TWDT 负责检测任务长时间不让步 CPU 运行的情况。

Watchdogs - ESP32 - — ESP-IDF Programming Guide latest documentation

默认已经启动了,中断看门狗-300ms和TWDT,TWDT—idle task 5秒

中断看门狗

中断看门狗是围绕定时器组 1 中的硬件看门狗构建的。如果由于某种原因这个看门狗无法执行调用 panic 处理程序的 NMI 处理程序(例如,因为 IRAM 被垃圾覆盖),它将硬重置 SOC。--这个不用写任何代码。

?任务看门狗定时器 (TWDT)

任务看门狗定时器 (TWDT) 负责检测运行的任务在长时间没有让出 CPU 的情况。这是 CPU "饥饿"的症状,通常是由一个高优先级任务不让出 CPU 资源的循环引起,从而使较低优先级任务无法获得 CPU 资源。这可能是外围设备上的代码写得不好,也可能是陷入无限循环的任务。

默认情况下,TWDT 将监视每个 CPU 的空闲任务,但任何任务都可以选择由 TWDT 监视。每个观察任务必须定期“重置” TWDT 以指示它们已被分配 CPU 时间。如果任务未在 TWDT 超时期限内重置,则将打印一条警告,其中包含有关哪些任务未能及时重置 TWDT 以及哪些任务当前正在 ESP32 CPU 上运行的信息。并且还有可能在用户代码中重新定义函数 esp_task_wdt_isr_user_handler 以接收此事件。

默认情况下,make menuconfig 中的 CONFIG_TASK_WDT 将被启用,导致 TWDT 在启动期间自动初始化。同样,CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU0 和 CONFIG_TASK_WDT_CHECK_IDLE_TASK_CPU1 也会默认启用,导致两个空闲任务在启动期间订阅 TWDT。

----需要用它来监测应用任务。如果某些任务一直没有正常执行,就直接重启系统了。如何操作?

参考文章给你如下代码,并不能复位系统呀

//Callback for user tasks created in app_main()
void reset_task(void *arg)
{
    //Subscribe this task to TWDT, then check if it is subscribed
    CHECK_ERROR_CODE(esp_task_wdt_add(NULL), ESP_OK);
    CHECK_ERROR_CODE(esp_task_wdt_status(NULL), ESP_OK);

    while(1){
        //reset the watchdog every 2 seconds
        CHECK_ERROR_CODE(esp_task_wdt_reset(), ESP_OK);  //Comment this line to trigger a TWDT timeout
        vTaskDelay(pdMS_TO_TICKS(TASK_RESET_PERIOD_S * 1000));
    }
}


ESP32任务看门狗实践_SimonLiu009的博客-CSDN博客_esp32看门狗

默认情况下,任务看门狗中断task_wdt_isr()会打印类似如下的信息:

E (10299) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
E (10299) task_wdt: ?- reset task (CPU 0/1)
E (10299) task_wdt: Tasks currently running:
E (10299) task_wdt: CPU 0: IDLE0
E (10299) task_wdt: CPU 1: IDLE1
E (10299) task_wdt: Aborting.

如果你希望任务看门狗触发之后进行重启,有以下两种方法

调用panic handler :在 make menuconfig --> Component config --> ESP32-specific选中 Invoke panic handler on Task Watchdog timeout--这个最简单

在main()中重新定义esp_task_wdt_isr_user_handler()函数,我在里面仅仅加了一个打印语句就会达到看门狗触发重启的效果,也不知道这是不是正确姿势。

?----不是所有的task都适合task wdt?一般都有一个while循环。应该都可以。

(2)stack

stack参考

FreeRTOS 接口: vTaskList() - 可优化内存和 task 栈溢出定位_乐鑫科技 Espressif的博客-CSDN博客_freertos vtasklist使用注意

原来的heap剩余空间也继续保留。

vTaskList() 使用

注意:

使用 vTaskList() 前需使能:--默认是使能的。

make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility

make menuconfig -> Component config -> FreeRTOS -> Enable FreeRTOS trace facility -> Enable FreeRTOS stats formatting functions

通过上面配置,等同于使能 FreeRTOSConfig.h 中如下两个宏:

configUSE_TRACE_FACILITY 和 configUSE_STATS_FORMATTING_FUNCTIONS

(3)CPU占用率

--需要打开一个选项

ESP32_FreeRtos_内存使用情况查看_weixin_50183638的博客-CSDN博客_freertos 内存使用查看

?

(4)heap

查看是否内存泄漏

//ESP_LOGI("[up]", "WaterMark=%d", uxTaskGetStackHighWaterMark(NULL));
//ESP_LOGI("[up]", "FreeHeap=%d, MiniEverFreeHeap=%d",xPortGetFreeHeapSize(), xPortGetMinimumEverFreeHeapSize());--当前剩余heap,历史上最小剩余heap。

(5)实际代码

 xTaskCreate(state_task, "state_task", 4096, NULL, 1, NULL);//lower than others task is ok

static void esp_print_tasks(void)
{
    char *pbuffer = (char *)malloc(2048);

    printf("FreeHeap=%d, MiniEverFreeHeap=%d\r\n",xPortGetFreeHeapSize(), xPortGetMinimumEverFreeHeapSize());
    vTaskDelay(10 / portTICK_PERIOD_MS);

    vTaskList(pbuffer);
    printf("%s", pbuffer);
    printf("----------------------------------------------\r\n");
    vTaskDelay(10 / portTICK_PERIOD_MS);

    vTaskGetRunTimeStats(pbuffer);
    printf("%s", pbuffer);
    printf("----------------------------------------------\r\n");
    vTaskDelay(10 / portTICK_PERIOD_MS);

    free(pbuffer);
}

static void state_task(void *pvParameters)
{

	while (1)
	{
		esp_print_tasks();
        vTaskDelay(300000 / portTICK_PERIOD_MS);
	}
}

(6)实际效果

第一列: task name
即 xTaskCreate 创建该 task 时第二个参数。
如果名称过长,会根据 configMAX_TASK_NAME_LEN 截断。

第二列: task 当前状态

X: running
B: blocked
R: ready
D: deleted
S: suspended
第三列: task 优先级
即 xTaskCreate 创建该 task 时第四个参数。
数字越大,优先级越高,建议客户设置 task 优先级在 1-9 之间,慎行!

第四列: 最小剩余 task 栈空间,字节为单位

  • 第五列: task 创建顺序

?--可以看见有多少个task,dm9051_tsk曾经挂掉,增加点栈空间,同时把task wdt增加上去。

core dump也很重要,重启后需要分析,单独记录

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:15:52  更:2022-04-01 00:16:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:50:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码