diff --git a/CMakeLists.txt b/CMakeLists.txt index 30fb584..4b2132d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,20 +57,10 @@ target_sources(${CMAKE_PROJECT_NAME} PRIVATE # User/component sources User/component/ahrs.c - - # User/component/ahrs sources - User/component/ahrs/ahrs.c - - # User/component sources User/component/crc16.c User/component/crc8.c User/component/error_detect.c User/component/filter.c - - # User/component/filter sources - User/component/filter/filter.c - - # User/component sources User/component/freertos_cli.c User/component/limiter.c User/component/pid.c @@ -92,6 +82,7 @@ target_sources(${CMAKE_PROJECT_NAME} PRIVATE # User/task sources User/task/ai.c User/task/init.c + User/task/rc.c User/task/user_task.c ) diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 8d21e2e..1f17afb 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -1,127 +1,127 @@ -/* USER CODE BEGIN Header */ -/** - ****************************************************************************** - * File Name : freertos.c - * Description : Code for freertos applications - ****************************************************************************** - * @attention - * - * Copyright (c) 2026 STMicroelectronics. - * All rights reserved. - * - * This software is licensed under terms that can be found in the LICENSE file - * in the root directory of this software component. - * If no LICENSE file comes with this software, it is provided AS-IS. - * - ****************************************************************************** - */ -/* USER CODE END Header */ - -/* Includes ------------------------------------------------------------------*/ -#include "FreeRTOS.h" -#include "task.h" -#include "main.h" -#include "cmsis_os.h" - -/* Private includes ----------------------------------------------------------*/ -/* USER CODE BEGIN Includes */ - -#include "task/user_task.h" -/* USER CODE END Includes */ - -/* Private typedef -----------------------------------------------------------*/ -/* USER CODE BEGIN PTD */ - -/* USER CODE END PTD */ - -/* Private define ------------------------------------------------------------*/ -/* USER CODE BEGIN PD */ - -/* USER CODE END PD */ - -/* Private macro -------------------------------------------------------------*/ -/* USER CODE BEGIN PM */ - -/* USER CODE END PM */ - -/* Private variables ---------------------------------------------------------*/ -/* USER CODE BEGIN Variables */ - -/* USER CODE END Variables */ -/* Definitions for defaultTask */ -osThreadId_t defaultTaskHandle; -const osThreadAttr_t defaultTask_attributes = { - .name = "defaultTask", - .stack_size = 128 * 4, - .priority = (osPriority_t) osPriorityNormal, -}; - -/* Private function prototypes -----------------------------------------------*/ -/* USER CODE BEGIN FunctionPrototypes */ - -/* USER CODE END FunctionPrototypes */ - -void StartDefaultTask(void *argument); - -void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ - -/** - * @brief FreeRTOS initialization - * @param None - * @retval None - */ -void MX_FREERTOS_Init(void) { - /* USER CODE BEGIN Init */ - - /* USER CODE END Init */ - - /* USER CODE BEGIN RTOS_MUTEX */ - /* add mutexes, ... */ - /* USER CODE END RTOS_MUTEX */ - - /* USER CODE BEGIN RTOS_SEMAPHORES */ - /* add semaphores, ... */ - /* USER CODE END RTOS_SEMAPHORES */ - - /* USER CODE BEGIN RTOS_TIMERS */ - /* start timers, add new ones, ... */ - /* USER CODE END RTOS_TIMERS */ - - /* USER CODE BEGIN RTOS_QUEUES */ - /* add queues, ... */ - /* USER CODE END RTOS_QUEUES */ - - /* Create the thread(s) */ - /* creation of defaultTask */ - defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); - - /* USER CODE BEGIN RTOS_THREADS */ - /* add threads, ... */ - osThreadNew(Task_Init, NULL, &attr_init); // 创建初始化任务 -/* USER CODE END RTOS_THREADS */ - - /* USER CODE BEGIN RTOS_EVENTS */ - /* add events, ... */ - /* USER CODE END RTOS_EVENTS */ - -} - -/* USER CODE BEGIN Header_StartDefaultTask */ -/** - * @brief Function implementing the defaultTask thread. - * @param argument: Not used - * @retval None - */ -/* USER CODE END Header_StartDefaultTask */ -void StartDefaultTask(void *argument) -{ - /* USER CODE BEGIN StartDefaultTask */ - osThreadTerminate(osThreadGetId()); -/* USER CODE END StartDefaultTask */ -} - -/* Private application code --------------------------------------------------*/ -/* USER CODE BEGIN Application */ - -/* USER CODE END Application */ - +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : freertos.c + * Description : Code for freertos applications + ****************************************************************************** + * @attention + * + * Copyright (c) 2026 STMicroelectronics. + * All rights reserved. + * + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "FreeRTOS.h" +#include "task.h" +#include "main.h" +#include "cmsis_os.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +#include "task/user_task.h" +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN Variables */ + +/* USER CODE END Variables */ +/* Definitions for defaultTask */ +osThreadId_t defaultTaskHandle; +const osThreadAttr_t defaultTask_attributes = { + .name = "defaultTask", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityNormal, +}; + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN FunctionPrototypes */ + +/* USER CODE END FunctionPrototypes */ + +void StartDefaultTask(void *argument); + +void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ + +/** + * @brief FreeRTOS initialization + * @param None + * @retval None + */ +void MX_FREERTOS_Init(void) { + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* USER CODE BEGIN RTOS_MUTEX */ + /* add mutexes, ... */ + /* USER CODE END RTOS_MUTEX */ + + /* USER CODE BEGIN RTOS_SEMAPHORES */ + /* add semaphores, ... */ + /* USER CODE END RTOS_SEMAPHORES */ + + /* USER CODE BEGIN RTOS_TIMERS */ + /* start timers, add new ones, ... */ + /* USER CODE END RTOS_TIMERS */ + + /* USER CODE BEGIN RTOS_QUEUES */ + /* add queues, ... */ + /* USER CODE END RTOS_QUEUES */ + + /* Create the thread(s) */ + /* creation of defaultTask */ + defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); + + /* USER CODE BEGIN RTOS_THREADS */ + /* add threads, ... */ + osThreadNew(Task_Init, NULL, &attr_init); // 创建初始化任务 + /* USER CODE END RTOS_THREADS */ + + /* USER CODE BEGIN RTOS_EVENTS */ + /* add events, ... */ + /* USER CODE END RTOS_EVENTS */ + +} + +/* USER CODE BEGIN Header_StartDefaultTask */ +/** + * @brief Function implementing the defaultTask thread. + * @param argument: Not used + * @retval None + */ +/* USER CODE END Header_StartDefaultTask */ +void StartDefaultTask(void *argument) +{ + /* USER CODE BEGIN StartDefaultTask */ + osThreadTerminate(osThreadGetId()); + /* USER CODE END StartDefaultTask */ +} + +/* Private application code --------------------------------------------------*/ +/* USER CODE BEGIN Application */ + +/* USER CODE END Application */ + diff --git a/Core/Src/main.c b/Core/Src/main.c index f0ca57a..a07844f 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -80,14 +80,6 @@ int main(void) /* USER CODE END 1 */ - /* Enable the CPU Cache */ - - /* Enable I-Cache---------------------------------------------------------*/ - SCB_EnableICache(); - - /* Enable D-Cache---------------------------------------------------------*/ - SCB_EnableDCache(); - /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ diff --git a/STM32H723XG_FLASH.ld b/STM32H723XG_FLASH.ld index dacf7cb..23e0809 100644 --- a/STM32H723XG_FLASH.ld +++ b/STM32H723XG_FLASH.ld @@ -229,6 +229,17 @@ SECTIONS PROVIDE( __bss_start = __tbss_start ); PROVIDE( __bss_size = __bss_end - __bss_start ); + /* DMA buffer section in RAM_D2 (SRAM1/2) for STM32H7 DMA access */ + .dma_buffer (NOLOAD) : ALIGN(32) + { + . = ALIGN(32); + _sdma_buffer = .; + *(.dma_buffer) + *(.dma_buffer*) + . = ALIGN(32); + _edma_buffer = .; + } >RAM_D2 + /* User_heap_stack section, used to check that there is enough RAM left */ ._user_heap_stack (NOLOAD) : { diff --git a/User/task/config.yaml b/User/task/config.yaml index a60cb69..e5142ea 100644 --- a/User/task/config.yaml +++ b/User/task/config.yaml @@ -5,3 +5,10 @@ function: Task_ai name: ai stack: 256 +- delay: 0 + description: '' + freq_control: true + frequency: 500.0 + function: Task_rc + name: rc + stack: 256 diff --git a/User/task/init.c b/User/task/init.c index 5e45f96..3d36093 100644 --- a/User/task/init.c +++ b/User/task/init.c @@ -31,6 +31,7 @@ void Task_Init(void *argument) { /* 创建任务线程 */ task_runtime.thread.ai = osThreadNew(Task_ai, NULL, &attr_ai); + task_runtime.thread.rc = osThreadNew(Task_rc, NULL, &attr_rc); // 创建消息队列 /* USER MESSAGE BEGIN */ diff --git a/User/task/rc.c b/User/task/rc.c new file mode 100644 index 0000000..3918e29 --- /dev/null +++ b/User/task/rc.c @@ -0,0 +1,56 @@ +/* + rc Task + 遥控器接收任务 - 处理DR16遥控器数据接收 +*/ + +/* Includes ----------------------------------------------------------------- */ +#include "task/user_task.h" +/* USER INCLUDE BEGIN */ +#include "device/dr16.h" +/* USER INCLUDE END */ + +/* Private typedef ---------------------------------------------------------- */ +/* Private define ----------------------------------------------------------- */ +/* Private macro ------------------------------------------------------------ */ +/* Private variables -------------------------------------------------------- */ +/* USER STRUCT BEGIN */ +/* STM32H7: 整个DR16结构体放在DMA可访问的SRAM区域 */ +static DR16_t dr16 __attribute__((section(".dma_buffer"))) __attribute__((aligned(32))); +/* USER STRUCT END */ + +/* Private function --------------------------------------------------------- */ +/* Exported functions ------------------------------------------------------- */ +void Task_rc(void *argument) { + (void)argument; /* 未使用argument,消除警告 */ + + + /* 计算任务运行到指定频率需要等待的tick数 */ + const uint32_t delay_tick = osKernelGetTickFreq() / RC_FREQ; + + osDelay(RC_INIT_DELAY); /* 延时一段时间再开启任务 */ + + uint32_t tick = osKernelGetTickCount(); /* 控制任务运行频率的计时 */ + /* USER CODE INIT BEGIN */ + /* 初始化DR16遥控器 */ + DR16_Init(&dr16); + /* USER CODE INIT END */ + + while (1) { + tick += delay_tick; /* 计算下一个唤醒时刻 */ + /* USER CODE BEGIN */ + /* 启动DMA接收 */ + DR16_StartDmaRecv(&dr16); + + /* 等待DMA接收完成,超时时间20ms */ + if (DR16_WaitDmaCplt(20)) { + /* DMA接收成功,解析数据 */ + DR16_ParseData(&dr16); + } else { + /* DMA接收超时,标记离线 */ + DR16_Offline(&dr16); + } + /* USER CODE END */ + osDelayUntil(tick); /* 运行结束,等待下一次唤醒 */ + } + +} \ No newline at end of file diff --git a/User/task/user_task.c b/User/task/user_task.c index fab1c01..9d28a17 100644 --- a/User/task/user_task.c +++ b/User/task/user_task.c @@ -13,4 +13,9 @@ const osThreadAttr_t attr_ai = { .name = "ai", .priority = osPriorityNormal, .stack_size = 256 * 4, +}; +const osThreadAttr_t attr_rc = { + .name = "rc", + .priority = osPriorityNormal, + .stack_size = 256 * 4, }; \ No newline at end of file diff --git a/User/task/user_task.h b/User/task/user_task.h index 8b52a53..aa957ec 100644 --- a/User/task/user_task.h +++ b/User/task/user_task.h @@ -14,10 +14,12 @@ extern "C" { /* Exported constants ------------------------------------------------------- */ /* 任务运行频率 */ #define AI_FREQ (500.0) +#define RC_FREQ (500.0) /* 任务初始化延时ms */ #define TASK_INIT_DELAY (100u) #define AI_INIT_DELAY (0) +#define RC_INIT_DELAY (0) /* Exported defines --------------------------------------------------------- */ /* Exported macro ----------------------------------------------------------- */ @@ -28,6 +30,7 @@ typedef struct { /* 各任务,也可以叫做线程 */ struct { osThreadId_t ai; + osThreadId_t rc; } thread; /* USER MESSAGE BEGIN */ @@ -50,16 +53,19 @@ typedef struct { /* 各任务的stack使用 */ struct { UBaseType_t ai; + UBaseType_t rc; } stack_water_mark; /* 各任务运行频率 */ struct { float ai; + float rc; } freq; /* 任务最近运行时间 */ struct { float ai; + float rc; } last_up_time; } Task_Runtime_t; @@ -70,10 +76,12 @@ extern Task_Runtime_t task_runtime; /* 初始化任务句柄 */ extern const osThreadAttr_t attr_init; extern const osThreadAttr_t attr_ai; +extern const osThreadAttr_t attr_rc; /* 任务函数声明 */ void Task_Init(void *argument); void Task_ai(void *argument); +void Task_rc(void *argument); #ifdef __cplusplus } diff --git a/balance_infantry.ioc b/balance_infantry.ioc index 7078b2f..a9cedb9 100644 --- a/balance_infantry.ioc +++ b/balance_infantry.ioc @@ -38,8 +38,8 @@ Bdma.SPI6_TX.0.SyncSignalID=NONE CAD.formats= CAD.pinconfig= CAD.provider= -CORTEX_M7.CPU_DCache=Enabled -CORTEX_M7.CPU_ICache=Enabled +CORTEX_M7.CPU_DCache=Disabled +CORTEX_M7.CPU_ICache=Disabled CORTEX_M7.Enable-Cortex_Memory_Protection_Unit_Region0_Settings=MPU_REGION_ENABLE CORTEX_M7.IPParameters=CPU_DCache,CPU_ICache,MPU_Control,Enable-Cortex_Memory_Protection_Unit_Region0_Settings,default_mode_Activation CORTEX_M7.MPU_Control=__NULL @@ -900,3 +900,4 @@ VP_MEMORYMAP_VS_MEMORYMAP.Signal=MEMORYMAP_VS_MEMORYMAP VP_SYS_VS_tim4.Mode=TIM4 VP_SYS_VS_tim4.Signal=SYS_VS_tim4 board=custom +rtos.0.ip=FREERTOS diff --git a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/s1PQAPIlnTPKm6mZzJoZZuB.l b/utils/Simulation-master/balance/series_legs/slprj/_jitprj/s1PQAPIlnTPKm6mZzJoZZuB.l deleted file mode 100644 index 0784ce8..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/s1PQAPIlnTPKm6mZzJoZZuB.l and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/s1PQAPIlnTPKm6mZzJoZZuB.mat b/utils/Simulation-master/balance/series_legs/slprj/_jitprj/s1PQAPIlnTPKm6mZzJoZZuB.mat deleted file mode 100644 index d1eaf63..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/s1PQAPIlnTPKm6mZzJoZZuB.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/skZgecjo1NwrHsHAQiPZ4HE.l b/utils/Simulation-master/balance/series_legs/slprj/_jitprj/skZgecjo1NwrHsHAQiPZ4HE.l deleted file mode 100644 index 4918c02..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/skZgecjo1NwrHsHAQiPZ4HE.l and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/skZgecjo1NwrHsHAQiPZ4HE.mat b/utils/Simulation-master/balance/series_legs/slprj/_jitprj/skZgecjo1NwrHsHAQiPZ4HE.mat deleted file mode 100644 index 0df35f0..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/skZgecjo1NwrHsHAQiPZ4HE.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/snB7M5QwQI4hNRLbuP13ztG.l b/utils/Simulation-master/balance/series_legs/slprj/_jitprj/snB7M5QwQI4hNRLbuP13ztG.l deleted file mode 100644 index ec52173..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/snB7M5QwQI4hNRLbuP13ztG.l and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/snB7M5QwQI4hNRLbuP13ztG.mat b/utils/Simulation-master/balance/series_legs/slprj/_jitprj/snB7M5QwQI4hNRLbuP13ztG.mat deleted file mode 100644 index 2dd2a83..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_jitprj/snB7M5QwQI4hNRLbuP13ztG.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/s1PQAPIlnTPKm6mZzJoZZuB.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/s1PQAPIlnTPKm6mZzJoZZuB.mat deleted file mode 100644 index 8c7ae55..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/s1PQAPIlnTPKm6mZzJoZZuB.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/skZgecjo1NwrHsHAQiPZ4HE.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/skZgecjo1NwrHsHAQiPZ4HE.mat deleted file mode 100644 index 3078668..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/skZgecjo1NwrHsHAQiPZ4HE.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/snB7M5QwQI4hNRLbuP13ztG.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/snB7M5QwQI4hNRLbuP13ztG.mat deleted file mode 100644 index 895fb3c..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/EMLReport/snB7M5QwQI4hNRLbuP13ztG.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/leg_sim/_self/sfun/info/binfo.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/leg_sim/_self/sfun/info/binfo.mat deleted file mode 100644 index a218a1a..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/leg_sim/_self/sfun/info/binfo.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/leg_sim/amsi_serial.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/leg_sim/amsi_serial.mat deleted file mode 100644 index 6ab35cb..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/leg_sim/amsi_serial.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/72vZ1DxF0Nmp1uyeOVki4F.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/72vZ1DxF0Nmp1uyeOVki4F.mat deleted file mode 100644 index 0ed5fba..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/72vZ1DxF0Nmp1uyeOVki4F.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/8TxxFELrVOZf4nge1lJ5jH.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/8TxxFELrVOZf4nge1lJ5jH.mat deleted file mode 100644 index 6187301..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/8TxxFELrVOZf4nge1lJ5jH.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/JPu9Qdz3VaGiF2LSvQFOuE.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/JPu9Qdz3VaGiF2LSvQFOuE.mat deleted file mode 100644 index 0ed5fba..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/JPu9Qdz3VaGiF2LSvQFOuE.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/MkkVTTjQfD4eZeRuuxNw2D.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/MkkVTTjQfD4eZeRuuxNw2D.mat deleted file mode 100644 index 823d309..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/MkkVTTjQfD4eZeRuuxNw2D.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/N8jHiuL3FACM3BiH3xonGE.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/N8jHiuL3FACM3BiH3xonGE.mat deleted file mode 100644 index 4741eb0..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/N8jHiuL3FACM3BiH3xonGE.mat and /dev/null differ diff --git a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/pz8kySzLQtSuU5A4IQZHYD.mat b/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/pz8kySzLQtSuU5A4IQZHYD.mat deleted file mode 100644 index 87ab1e6..0000000 Binary files a/utils/Simulation-master/balance/series_legs/slprj/_sfprj/precompile/pz8kySzLQtSuU5A4IQZHYD.mat and /dev/null differ