自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

tecoes的博客

本博客仅仅是作者对学习的一个记录,转载自网络的文章,如果有侵犯的权益请联系作者做一个声明~~~

  • 博客(602)
  • 收藏
  • 关注

原创 WiFi扫描使用的结构体-qosa_wifi_ap_info_t与qosa_wifiscan_config_t

结构体专门用于存储单次 WiFi 扫描中发现的单个 AP(无线接入点)的详细信息结构体字段作用bssid[6]存储 AP 的 MAC 地址(BSSID)channel存储 AP 工作的信道编号rssival存储 AP 的信号强度(单位 dBm)ssid_len存储 AP 的 SSID(名称)长度ssid[33]存储 AP 的 SSID(最多 32 字节 + 结束符)reserve预留字段,为扩展兼容设计WiFiSCAN 是扫描功能的实现主体,负责执行扫描动作、管理扫描参数、处理扫描流程;

2026-01-14 09:00:37 347

原创 file_demos CMakeLists.txt

target_link_libraries_if 也是工程自定义的宏/函数(类似 if(...) target_link_libraries(...) endif() 的封装)。:如果配置项 CONFIG_OSA_LINK_SYSTEM_LIBRARIES_FUNC 为真,就让 file_demo 链接 system_os 库。同理:如果 CONFIG_QCM_FILE_API_FUNC 开启,就链接 qcm_file 库(提供文件相关 API/实现)。创建一个名为 file_demo 的静态库目标。

2026-01-13 13:50:54 360

原创 移远SDK qos_app_init.c文件分析

也就是说:main_entry →(注册)→ 系统回调调度 → appInit → qosa_system_jump_app → qosa_app_boot/qosa_app_main → 最终进入你 app.bin 的 qos_app_preboot/ql_app_main。因为 appInit 作为“系统应用入口”被调度运行后,才去读取配置/获取 qosa_get_app_addr(),然后 b.w qosa_system_jump_app。

2026-01-13 11:30:14 424

原创 移远SDK ql_app_pre_init.c文件解析(二)

我先把你当前文件完整读出来(分段),然后按“每一段代码块/关键语句”逐行解释:包括 .ql_app_entry 的作用、qos_app_preboot() 参数来自哪里、以及 m_get_api_ptr/virtual_func_tbl 与 vAPITable 的对应关系。引入 open-mode 的关键结构体/宏:QUEC_OPENSDK_MAGIC、ql_boot_para、ql_static_mapping、func_mapping、qos_app_entry_s 等。

2026-01-12 22:50:10 310

原创 .map文件内容总结

vm_per_get_fun_ptr 地址 0x0094e104 且来自 libquec_adapt.a(qos_system_api_map.o):见 ap_at_command.map:22722-22724 和 ap_at_command.map:88216。ap_at_command.map 是链接器(ld)输出的“链接结果账本”:把每个段/符号最终放到哪个地址、占多少字节、来自哪个 .o/.a 都写清楚,用于定位“谁定义了它/它在内存哪/为什么变大”。

2026-01-12 22:30:29 325

原创 移远SDK ql_app_pre_init.c文件解析(一)

内核/bootloader/加载器会在加载 app.bin 时,按链接脚本约定的位置去读 .ql_app_entry 里的 qos_app_entry_s结构体,然后调用里面的函数指针(如 qos_boot/qos_app),其中 ENTRY(qos_app_preboot) 也说明了 app 的入口。.ql_app_entry 0x00a58000 0x60,来源对象是 .../ql_app_pre_init.o。qos_app_linkscripts_ec718pm.ld链接脚本。

2026-01-12 17:17:02 251

原创 objdump、nm、addr2line命令解析

objdump:核心是 “反汇编”,将二进制固件转成汇编代码(可关联 C 源码),用于查看代码的汇编实现或分析指定地址的指令。nm:核心是 “查符号 - 地址映射”,列出所有函数 / 变量的地址,是找到目标地址的前提。addr2line:核心是 “地址溯源”,根据地址快速定位到对应的 C 源码文件、函数、行号,是调试崩溃的关键工具。这三个工具是嵌入式开发中分析 ELF 固件、定位代码问题的黄金组合,你的脚本完整覆盖了 “查地址→反汇编分析→地址溯源” 的核心调试流程。

2026-01-12 15:48:19 315

原创 通过函数地址从符号名中反汇编函数名

经过上面的命令,脚本已经编译成功,生成的elf在D:\TBOX\SDK\QSR01A01_C_SDK_LTE_E_BETA20251225\qos_build\release\EC800ZCNLFR01A01M04_BETA0403_OCPU\DBG下,继续执行反汇编。PS D:\TBOX\SDK\QSR01A01_C_SDK_LTE_E_BETA20251225\qos_build\release\EC800ZCNLFR01A01M04_BETA0403_OCPU\DBG> # 示。

2026-01-12 15:08:05 632

原创 移远 api对应的内核映射函数地址解析

qosa_msgq_create qos_app_api_map.c:8979 "qosa_msgq_create" m_get_api_ptr = kernel_maping->get_fun_ptr_dep_name:ql_app_pre_init.c:97 内核侧该 API 的函数地址。qosa_task_get_current_ref qos_app_api_map.c:9236 "qosa_task_get_current_ref" 同上 同上。

2026-01-12 11:59:37 785

原创 移远SDK 文件ql_app_main.h及ql_app_main.c分析

这个结构体就是“应用注册信息”。系统启动阶段会去某处遍历 .LOAD_APP_TABLE 段里的这些结构体,然后按 app_entry/stack_size/startup_prio/argv 去创建对应任务。这行会生成一个 appRegItem_t 全局变量,并被链接脚本 KEEP(*(.LOAD_APP_TABLE*)) 收进 .LOAD_APP_TABLE 段。#include "ql_os.h":RTOS 封装 API(这里用到了 ql_rtos_task_create、ql_task_t)。

2026-01-12 10:23:53 946

原创 雅讯SDK中LBS回调函数的调用时机

在这个文件里,test_lbs_event_cb 会在“你把回调函数指针交给 LBS 模块之后”,由 LBS 模块内部任务/事件机制异步调用。result == ADP_LBS_RESULT_SUCC 时,param 指向 ADP_LBS_POSTION_T(你代码里强转并打印经纬度等)回调是异步的,所以你用 g_test_lbs_done + TaskSleep 轮询等待,这是在等回调把标志位置起来。(启动 LBS,并注册回调)

2026-01-10 16:22:59 182

原创 雅讯SDK wifi扫描结果触发回调时机

所以结论:只要注册成功,并且调用了 ADP_WIFISCAN_Start(),在扫描进行中/完成时就会触发 adp_wifiscan_cb;在 wifitaskcallback() 里先 cb.wifi_scan_callback = adp_wifiscan_cb;adp_wifiscan_cb 是你通过 ADP_WIFISCAN_RegEvent(&cb) 注册进去的“扫描结果通知回调”,它不是你主动调用的,而是 WiFi 扫描模块在扫描过程中/结束时异步回调。

2026-01-10 14:56:26 117

原创 CMakeLists.txt

关键点:上层主工程里会 target_link_libraries(userspace PRIVATE YXAPP),把这个库链接进最终的 userspace.elf。有几种“最靠谱”的办法可以确认 PROJECT_BINARY_DIR 和 CMAKE_SOURCE_DIR 到底指向哪个目录(而且能区分“顶层/子目录”场景)。${PROJECT_BINARY_DIR} 一般是顶层构建目录(比如 out/.../build 之类),所以最终会落到 .../lib/ 下。

2026-01-08 16:12:42 847

原创 脚本编译中怎么将/application/aima或/application/demo目录编译进去的

build_yaxon.bat 里有 set build_option=%1:这会把 build_option 设置成当前 cmd 进程的环境变量,并且会被子进程继承(GNUmake.exe、再到 cmake),因此 CMake 里 $ENV{build_option} 能读到。所以你要编 demo:用 build_yaxon.bat demo(或在命令行里先 set build_option=demo 再执行 GNUmake.exe ...)。4) build_option 从哪来(你现在的脚本链路)

2026-01-08 14:44:45 319

原创 makefile与cmake调用

Makefile 如果不存在/过期,顶层 Makefile 就会执行 cmake ... -B out/<SCMODULE> ... -G <generator> <源码根目录> 来“生成”这个构建目录,见同一段 Makefile:486-535。顶层 Makefile 里有一条关键规则:当需要构建 out/<SCMODULE>/<APP_NAME>.elf 时,会先依赖 Makefile(也就是“构建目录里的 Makefile”),见 Makefile:486-535。

2026-01-08 13:59:32 542

原创 makefile 中 patsubst、notdir、wildcard 等函数解析

作用:在 Makefile 中模拟 Shell 的通配符(?[]),扫描文件系统,返回所有匹配 PATTERN 的文件 / 目录路径列表(多个结果用空格分隔)。关键特点如果没有匹配到任何内容,直接返回空字符串(不是null,是完全空);区别于普通的:Makefile 本身不解析通配符,必须用wildcard才能让生效。makefile作用:接收一个 / 多个路径字符串(空格分隔),去掉所有路径前缀,只保留「最后一级的文件名 / 目录名」。关键特点。

2026-01-08 13:48:15 817

原创 makefile代码解析

makefile定义一个名为CACHE_FILE的变量,值为cache.mak,用于指定缓存文件的名称,后续可能会用来存储或读取构建缓存信息。makefile定义工具链分支()和应用代码分支(APP_BRANCH)的固定名称,后续编译时可能会用这些分支名拉取对应代码或标记版本被注释掉,暂时不启用预构建目录缓存路径自动识别:通过脚本自身路径,自动计算出工程根目录,无需手动配置目录结构适配:根据根目录下是否存在kernel文件夹,区分两种不同的工程目录结构,动态设置内核、工具、应用等核心目录的路径。

2026-01-08 13:37:07 704

原创 makefile中出现的大量$(1),$(2)等等什么意思,从哪传递进来的

如果你想我帮你“反查”你这套工程里 $(2)/$(3)/$(4) 的具体取值列表分别在哪里定义(比如哪些 *_HD_CFG_LIST / *_HD_OPT_LIST / *_USR_OPT_LIST),我可以再在 Makefile 和被 -include 的 .mak 里把定义点找出来,并告诉你某个固件名到底对应哪 4 段。也就是说:A7680C_LNXV_1605_V902_OPENSDK_YAXON_TLS13_EXTWDG_INS 这种“固件名”其实就是 kernel 下面的目录名之一。

2026-01-08 13:17:59 904

原创 makefile怎么传递和使用位置变量,比如$(1),$(2)的

Makefile 中用define定义函数 / 宏,调用时通过$(call 函数名,参数1,参数2,...)传递参数,函数内部用$(1)$(2)接收。完整 Makefile 示例makefile# ====================== 定义带位置参数的函数 ======================# 定义函数:编译单个 .c 文件为 .o 文件(参数1:源文件,参数2:编译选项)@echo "编译 $(1) -> $(1:.c=.o)" # $(1:.c=.o):把源文件名的.c替换为.o。

2026-01-08 10:42:51 356

原创 makefile怎么传参的

核心传参方式:执行make时通过变量名=值传参,Makefile 中用$(变量名)读取,多个参数用空格分隔。默认值设置:用变量名?= 默认值给参数兜底,避免空值,传参时会自动覆盖默认值。特殊处理:参数含空格 / 特殊字符时用引号包裹,传递给子脚本直接拼接即可。适用场景:动态控制编译版本、构建模式、文件路径等,是 Makefile 灵活适配不同构建需求的核心技巧。核心方法:通过变量名=值传参,结合?设置默认值,用ifeq判断参数值来拼接CFLAGSLDFLAGS等编译选项;常用场景。

2026-01-08 10:11:51 643

原创 window脚本中怎么添加打印和注释

打印输出:核心用echo命令,@echo off可关闭命令回显让输出更整洁,特殊字符需用转义。注释:单行注释优先用(简洁)或rem(官方);多行注释可通过goto + 标签实现,注意不能写在命令行末尾(易失效)。echo.可输出空行,覆盖写入文件、>>追加写入文件。

2026-01-08 09:19:35 206

原创 单线通信概述

特性维度优点缺点硬件资源节省 GPIO、简化布线、降低成本无硬件外设加速,完全依赖软件模拟传输性能协议轻量,适配小型设备速率低、带宽小,不支持高速大数据传输组网能力支持多从机并联,地址区分节点主从固定,不支持多主通信,易冲突开发调试代码量小,无需依赖专用外设时序敏感,协议不统一,调试难度高适用场景小型传感器、低功耗设备、分布式监控高速通信、实时交互、多主对等通信场景适合用单线通信的场景数据量小(单次传输 < 32 字节)、传输速率要求低(<100kbps);

2026-01-07 10:01:02 596

原创 YHM4005CSST看门狗芯片

引脚号引脚名功能说明1WI看门狗输入(喂狗引脚):接收主控 MCU 的周期性脉冲信号,未按时收到则触发超时。2RE复位使能:低电平有效,控制复位功能的开启 / 关闭。3SDA单线通信引脚:用于配置看门狗超时周期、读取状态等(I²C/SMBus 协议)。4GND电源地:芯片参考地。5Rdelay复位延时配置:外接电容调整复位信号的持续时间。6WO看门狗输出:超时后输出复位信号(通常为低电平),连接主控 MCU 的复位引脚。7EN芯片使能:高电平有效,控制芯片的工作 / 待机状态。8VIN。

2026-01-07 09:56:45 1006

原创 线程任务中不增加内部延时的处理方法

你的担忧很合理:在 for 循环里加 osDelay(100) 进行重试,如果 send 失败,实际会导致整个 while(1) 的周期变长(比如本来 100ms,失败重试后可能变成 200ms+),影响主循环的时序和实时性。不要在主循环里阻塞等待重试。这样主循环不会被单次 send 失败拖慢。记录需要重试的数据包和下次重试的时间戳,每次 while(1) 时判断是否到达重试时间,到达则重试,否则跳过。如果系统支持,可以把发送和重试逻辑放到单独的线程或任务里,主循环只负责分发数据,发送线程负责重试和延时。

2026-01-06 13:27:05 203

转载 UML状态图入门

UML状态图是一种描述对象在其生命周期内的状态以及状态之间的转换关系的图形化表示方法。它由状态、转换和事件组成,用于展现对象在不同状态下的行为和状态之间的转换规则。用实线箭头来表示控制从一种状态到另一种状态的转换或变化。箭头标有导致状态变化的事件。使用圆圈符号中的实心圆圈来表示状态图中的最终状态。行驶过程如果畅通:状态则变更为准时到站,到此结束。行驶过程如果堵车:状态则变更为延迟到站,到此结束。用一个黑色的圆圈代表一个系统或一个类的初始状态。用一个指向状态本身的实线箭头来表示自我转换。

2026-01-06 09:09:29 13

原创 git常见操作

git reset --hard HEAD会同时修改版本库、暂存区和工作区,强制让这三个区域完全匹配。当然回退代码还有git reset --soft HEAD和git restore,可以自己研究。可以理解为:“彻底回滚,清空所有未提交的修改,回到指定版本的纯净状态”。可以理解为:“彻底回滚,清空所有未提交的修改,回到指定版本的纯净状态”。如果代码比较少,可以本地拷贝出来,然后执行git reset --hard HEAD。接下来需要查看git分支的代码,下面是我所在的项目代码。

2025-12-31 11:29:31 929

原创 用static或局部变量代替栈上超大局部变量或局部结构体

1500 字节的局部变量可用static局部变量或全局变量替代,能彻底避开栈溢出风险;优先选static局部变量(作用域受限,命名冲突风险低),全局变量仅在跨函数 / 文件使用时考虑;若需灵活控制变量生命周期(如每次调用都释放),也可选用malloc在堆上分配(记得free避免内存泄漏)。static局部变量的作用域仍局限于定义它的函数,外部无法访问 —— 这是它优于全局变量的核心点,但也需注意:函数内不同分支对static变量的修改会相互影响。示例val += 5;// 分支1修改val。

2025-12-27 10:12:22 587

原创 中移模组栈溢出问题

enter 能打出来、aes_ciphertext_responce 内部的最后日志也能打出来,但回到调用处的 leave 打不出来,说明在从函数返回到调用栈的过程中就挂了或跳飞了。选中代码,enter有打印,aes_ciphertext_responce最后一行也打印了,就是leave aes_ciphertext_responce ret没有打印,突然断了。如果 aes_ciphertext_responce 内部有局部溢出,也会破坏返回地址/栈帧,现象相同。

2025-12-26 21:20:40 182

原创 两个线程间的数据传递

对tsp_control.c及tsp_vehicle_data.c文件,牵扯到一个知识点,如果tsp_vehicle_data.c线程中需要tsp_control.c线程变量,除了全局变量,有什么好的传递变量的方式。:tsp_vehicle_data 提供回调,tsp_control 更新数据时调用回调,把数据传入参数;:tsp_vehicle_data 订阅事件,tsp_control 在数据更新时广播(可用轻量事件总线或多个队列)。若是状态/控制命令:用消息队列或事件+锁保护的共享结构。

2025-12-26 10:21:07 208

原创 搜下代码中使用这两个结构体的地方,解释下这两个结构体具体使用场景和定位

SHARE_KEY:握手输出的会话密钥仓库,后续所有 AES/HMAC 加解密均依赖其中的 WRITEKEY*/HMACKEY*/IV*。RND_HANDSHAKE_DATA:握手期的随机数与 IV 载体,也是 PRF 输入。搜下头文件中代码中使用这两个结构体的地方,解释下这两个结构体具体使用场景和定位。

2025-12-22 13:16:27 343

原创 VScode左边和右边辅助边框的修改

同时右侧选中的插件---右键---重置位置,可以将插件再放回左侧的边框上。默认是copilot插件。选中左侧边框的插件---移动到,可以将左侧的插件改到右侧边框显示。点击三个点的按钮,可以选择右侧的辅助栏显示哪个插件。

2025-12-17 22:59:04 314

原创 如何将VSCode的扩展同步到另一台电脑

要将 Visual Studio Code (VSCode) 的扩展同步到另一台电脑,你可以使用 VSCode 内置的“Settings Sync”功能。

2025-12-16 22:50:05 591

原创 车联网ECU、TSP与TBOX通信流程

对比维度ECU(电子控制单元)BMS(电池管理系统)应用场景传统燃油车 + 新能源汽车仅限新能源汽车核心作用控制整车各系统运行管理动力电池安全与寿命车联网角色数据采集与传输的核心载体提供电池相关的核心数据。

2025-12-16 09:01:18 886

原创 485报文订阅服务

/订阅者消息队列指针数组,最多支持8个订阅者(如不同模块/线程对同一服务的数据感兴趣)接收流程就是上面介绍的那样,别的服务只要注册了自己的消息队列到我的订阅服务中,就可以通过MsgQueue_Receive去接收我发送结构体数据。我自己就可以通过MsgQueue_Send发送自己的数据消息到自己的订阅服务结构体的消息队列中。// 用于管理某类服务的数据订阅关系,支持多个订阅者注册/注销,便于模块间解耦和消息分发。

2025-12-13 17:06:11 752

原创 代码中为啥用自定义的消息队列数据结构,而不用osMessageQueueId_t系统自带的消息队列类型创建消息

自定义的 MessageQueue 可以根据业务需求灵活调整,比如支持不同的数据结构、队列长度、阻塞/非阻塞行为、内存管理方式等,满足特定场景下的优化需求,而系统自带的 osMessageQueueId_t 通常功能固定,灵活性有限。结合你项目的代码风格和结构,明显是为了适配多平台、保证灵活性和可控性,才采用了自定义的 MessageQueue,而不是直接用 osMessageQueueId_t 这类系统自带类型。自定义队列便于调试和维护,遇到问题时可以直接修改源码,排查和修复更方便。

2025-12-13 16:00:02 179

原创 基于C语言和mbedtls库,实现TLS 加密通信落地

以下是基于实现 TLS 加密通信的完整落地代码,包含和,适配 Linux / 嵌入式 Linux 环境,兼顾可读性和生产级安全规范。

2025-12-13 13:21:05 506

原创 TLS 加密通信落地实操:为 TCP 服务器集成 mbedtls 的 7 步安全加固法

mbedtls(前身 PolarSSL)是轻量级加密库,适配嵌入式 / 服务器端 TCP 通信场景,以下 7 步流程从环境搭建到安全加固,完整实现 TCP 服务器的 TLS 加密改造,兼顾易用性与安全性。

2025-12-13 13:13:10 674

转载 嵌入式文件系统LittleFS

这块板子基于高性能ARM Cortex-M4内核,主频高达180MHz,配有丰富的外设接口,最关键的是它预留了一个SOIC-8插座,可外接W25Q系列SPI Flash芯片,典型容量为8MB(W25Q64),正好成为我们施展拳脚的理想舞台!简单来说,四个 API 是用户层的操作入口,LittleFS 内核是 “调度中枢”,底层驱动是 “硬件桥梁”,三者协同实现了 API 到 Flash 硬件的间接关联,既屏蔽了 Flash 物理特性的复杂性,又保证了嵌入式场景下的掉电安全和存储可靠性。

2025-12-13 11:05:52 73

原创 中移 ML307R SDK 定时器原理

osTimerNew 会在 RTOS 内部分配一个定时器资源,并返回一个定时器句柄(osTimerId_t)。用 osKernelGetTickFreq(),返回值如1000表示1ms=1tick,100表示1tick=10ms。总结:osTimerNew 只是创建定时器对象,实际定时和回调由 RTOS 内核调度,适合做定时事件、周期任务等。回调函数在定时器中断或定时器服务线程上下文中被调用,适合做轻量级、快速的定时任务。osTimerPeriodic:周期性定时器,到期后自动重装载,周期性触发回调。

2025-12-12 14:16:49 287

原创 TSP与TBOX概念

T-Box(Telematics Box)是车辆智能网联系统中的重要组成部分,主要用于采集车辆数据并与TSP(Telematics Service Provider,车联网服务提供商)进行实时通信。数据采集与处理:T-Box通过CAN总线采集车辆的各类数据,包括车辆控制信息、行驶信息、故障信息等,并对这些数据进行解析处理。处理后的数据被用于实现车辆智能网联的关键功能。远程控制功能:TSP可以通过T-Box实现对车辆的远程控制。例如,远程启动、关闭引擎、空调等,还可以实现远程寻车、定位、锁车等功能。

2025-12-12 09:40:35 349

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除