Watchdog Timers(WDT)

news2024/11/18 18:48:05

文章目录

  • 1. 介绍
  • 2. Feature List
  • 3. 概述
    • 3.1. Safety Watchdog
    • 3.2. CPU Watchdog
  • 4. 看门狗定时器功能
  • 5. Endinit Functions
    • 5.1 Password Access to WDTxCON0
      • 5.1.1 Static Password
      • 5.1.2 Automatic Password Sequencing
    • 5.2 Check Access to WDTxCON0
    • 5.3 Modify Access to WDTxCON0
    • 5.4 总结
      • 5.4.1 清除ENDINIT流程
      • 5.4.2 设置ENDINIT流程
  • 6. Timer
    • 6.1. Timer Modes
      • 6.1.1 Time-Out Mode
      • 6.1.2 Normal Mode
      • 6.1.3 Disable Mode
      • 6.1.4 WDT状态机
      • 6.1.5 总结
    • 6.2 WDT Alarm Request
    • 6.3 Servicing the Watchdog Timer
  • 7. Demo
    • 7.1 Watchdog_1_KIT_TC375_LK

1. 介绍

Watchdog Timers (WDT)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-AURIX_TC3xx_Part1-UserManual-v01_00-EN.pdf 文档“9.4Watchdog Timers (WDT)”章节。
在这里插入图片描述

2. Feature List

TC37x支持一个Safety Watchdog和三个CPU Watchdog(每个核一个)
每个看门狗定时器具有以下基本功能:

  • 可编程时基和重新加载值(Watchdog基本功能,超时复位)
  • 可编程密码保护与可配置的自动密码排序(访问一次后,下次访问密码支持特点规则变化)
  • 可编程时间戳检查与可编程窗口
  • 无效或缺失定时器刷新顺序导致安全警报
  • 可以在调试期间挂起看门狗操作
  • 关键寄存器写保护,只能在短时间内解除锁定(ENDINIT保护)

第一个和最后一个为主要功能。

3. 概述

WDT提供了一种高度可靠和安全的方式来检测和恢复软件或硬件故障。WDT有助于在用户指定的时间段内中止CPU或系统的意外故障。
在这里插入图片描述
除了这个标准的“看门狗”功能之外,每个WDTs都包含一个结束初始化(ENDINIT)特性,可以保护临界寄存器免受意外写操作的影响。为了保护这些功能,实现了一个复杂的方案,在访问WDT控制寄存器期间需要密码和保护位。

  • 任何写访问如果没有提供正确的密码或保护位的正确值,都被认为是系统故障,并导致看门狗报警。
  • 即使执行有效的访问和清除ENDINIT位(用于提供对关键寄存器的访问),Watchdog也会对该访问窗口施加时间限制。如果ENDINIT位在时间窗口内没有被正确设置,则假定系统出现故障。

这些严格的要求,虽然不能保证,但是为系统操作的健壮性提供了高度的保证。

3.1. Safety Watchdog

安全看门狗定时器提供了一个整体的系统级看门狗,它独立于CPU看门狗定时器,还提供了另一种防止意外写入安全关键系统寄存器的保护。当启用安全WDT时,如果在用户可编程的时间段内没有提供喂狗服务,则会引起SMU报警请求。CPU必须在此时间间隔内进行喂狗,以防止这种情况发生。对安全WDT超时的响应可以在SMU中配置。因此,定期对安全WDT进行喂狗可以确认系统运行正常。

在模块寄存器表中标记为“SE”的寄存器被认为是安全关键系统的静态属性,并且在初始化后都是开启写保护的。如果Safety ENDINIT位被清除,这个写保护可能会被暂时移除

3.2. CPU Watchdog

单独的CPU看门狗计时器提供了监视单独的CPU执行线程的能力,而不需要软件来协调公共看门狗的共享使用。当CPU WDT使能时,如果在用户可编程的时间段内没有提供喂狗服务,则会引起SMU告警请求。SMU可以配置对每个cpu看门狗超时的响应。因此,对CPU WDT的定期维护可以确认相应的CPU正在按预期执行软件序列。复位后,CPU0运行,CPU0 Watchdog Timer自动启动。其他cpu最初处于HALT状态,因此它们对应的看门狗定时器被禁用。其他CPU Watchdog Timers默认不配置为生成超时重置,但可以启用。CPU看门狗只能由相应的CPU配置、启用或禁用。
在模块寄存器表中

  • 标记为“CEy”(y= CPU编号)的寄存器是与CPU相关的关键寄存器,它们在初始化后开启写保护的。如果清除对应的cpu (y-CPU号)Watchdog ENDINIT位,该写保护可能会暂时取消。
  • 标记为“E”的寄存器是关键系统寄存器,它们在初始化后开启写保护的。如果任何CPU Watchdog ENDINIT位被清除,这个写保护可能会被暂时移除。

Eg:
在这里插入图片描述
具体含义可见“1.1.6 Register Access Modes”章节
在这里插入图片描述

4. 看门狗定时器功能

  • 16位看门狗定时器
  • 可选输入频率:fSPB/64, fSPB/ 256或fSPB/16384
  • 16位用户自定义加载值正常看门狗定时器操作,固定加载值超时模式
  • 结合相应的ENDINIT位并监控其修改复杂的密码访问机制与用户可定义的密码字段
  • 访问错误检测:密码无效(第一次访问时)或保护位无效(第二次访问时)触发告警请求SMU
  • 时间和逻辑监控功能:
  • 可选的代码序列检查。码序签名识别错误会触发向SMU发送告警请求
  • 可选的代码执行时间检查。代码执行时间超出预期限制将触发向SMU发出警报请求。
  • 溢出错误检测:当WDT计数器溢出时,向SMU发出告警
  • 可禁用看门狗功能;访问保护和ENDINIT位监控功能保持开启状态

5. Endinit Functions

部分寄存器(CLC\KRST0\KRST1等)通常情况下只会在程序运行时修改一次,为避免在正常运行期间寄存器值被篡改,导致系统崩溃,Ifx提供了ENDINT(“初始化结束”)保护,仅清除对应ENDINIT标志位后,才能修改对应寄存器值,修改完成后,重新设置ENDINIT,完成一次修改。
注意:清除到设置ENDINIT标志位的时间不能过长,否则会触发Alarm信号,上报错误到SMU(Safety Management Unit)模块。

根据寄存器类型不同,Ifx细分以下三种类型的ENDINIT。

  • “CEy”-CPU临界寄存器。CPU WDT ENDINIT=0 (y=CPU编号)时可写
  • “E”-系统关键寄存器,当任何(一个或多个)CPU看门狗定时器ENDINIT= 0或EICONO.ENDINIT =0(Global ENDINT,前者依赖硬件,后者可以理解为存软件控制)时可写
  • “SE”-安全关键寄存器-只有当安全看门狗定时器ENDINIT=0或SEICON0.ENDINIT=0 (Global Safety ENDINT)时才可写

框图如下:
在这里插入图片描述
总结:
CEy:只能通过WDTCON0.ENDINIT清除
E:可以通过每个CPU的ENDINIT标志位位清除,也可以用全局的EICON0.ENDINIT清除
SE:可以通过WDTSCON0.ENDINIT标志位清除,也可以用全局的SEICON0.ENDINIT清除
注意:清除ENDINIT位需要一些时间。在清除ENDINIT位之后访问受ENDINIT保护的寄存器必须在真正清除ENDINIT位时才进行。所以,ENDINIT位应该在ENDINIT位被清除后第一次访问受ENDINIT保护的寄存器之前回读一次。

为保证整个系统的稳定,清除、设置ENDINIT等操作也有严格时序,对WDTxCON0寄存器的访问分为Password Access,Check Access,Modify Access三种操作。

5.1 Password Access to WDTxCON0

必须使用正确的密码写入WDTxCON0 (x=CPU, y=CPU number,或S),才能解锁并进行修改。软件必须事先知道正确的密码(上电后默认密码为0x3C)。为了提供独立的看门狗功能,每个看门狗定时器的密码可以不同,程序流具有独立的看门狗功能。

  • Safety WDG的WDTSCON0由通用SCU保护方案保护,该方案只允许配置的Master具有写访问(参见ACCEN10)。
  • CPU WDG的WDTCPUyCON0被单独保护,因此它们只能由相应的CPU写入。

密码有效且SMU状态满足WDTxSR的要求。那么一旦密码访问完成,WDTxCON0将被解锁
(WDTxCON0.LCK = 0)。为了确保正确的服务顺序,只有在访问之前设置了WDTxCON0.LCK位时才允许密码访问。如果在密码访问过程中,WDTxCON0写入了不正确的密码值,触发看门狗访问错误。设置WDTxSR.AE位,并向SMU 发送Alam请求。
14位用户自定义密码,WDTxCON0.PW提供了根据应用程序需要调整密码要求的额外选项。例如,它可以用来检测意外的软件循环,或者监视例程的执行顺序。密码要求如下表所示:在这里插入图片描述PAS: Password Auto-sequence Status Flag, 用于控制下次访问秘钥时是否需要改变,具体见Automatic Password Sequencing章节。

5.1.1 Static Password

在静态密码模式下(WDTxSR.PAS=0),密码只能通过有效的修改权限进行修改。密码访问的设计使得不能简单地读取寄存器并重新写入它。某些密码读取位在被重写之前必须反转(切换)。这可以防止简单的故障通过简单的读/写序列意外解锁WDT。

5.1.2 Automatic Password Sequencing

启用了自动密码排序(WDTxSR.PAS=1),每次密码检查(Password Access or Check Access)后密码自动更改。下一个密码期望值遵循基于14位斐波那契LFSR(线性反馈移位寄存器)的伪随机序列,其特征多项式为x14+x13+x12+x2+1。
在这里插入图片描述

5.2 Check Access to WDTxCON0

Check Access与Password Access相同,只是锁位不被清除,因此不允许后续的修改访问。在满足写数据要求的情况下,Check Access不会触发SMU告警请求。Check Access只能在LCK位被设置的情况下执行。
这种类型的访问用于WDT服务之间的中间检查点。这可以用(例如在与时间戳计数检查特性(或序列密码)结合使用,用于任务序列或执行时间监视。
在这里插入图片描述
如果在Check Access过程中,WDTxCON0上写了不正确的值(秘钥错误),则触发Watchdog Access Error。设置WDTxSR.AE,并向SMU (Safety Management Unit)发送告警请求。

个人理解:启用PAS后,秘钥序列是固定的,例如秘钥序列为0x12->0x34->0x56,正常情况下依次使用三个秘钥发起Check Access,若正确访问,则访问序列正确,若在中断或其他任务中,使用其他秘钥发起Check Access,则WDT报错。

5.3 Modify Access to WDTxCON0

如果WDTxCON0 通过Password Access成功解锁,下面对WDTxCON0的写访问可以修改它。但是,这种访问还必须满足某些要求,才能被接受并被视为有效。表265列出了所需的位模式。如果访问不遵循这些规则,则检测到看门狗访问错误条件,设置位WDTxSR.AE,向SMU (Safety Management Unit)发送告警请求。修改访问完成后,再次设置WDTxCONO.LCK,自动重新锁定WDTxCON0。在可以再次修改寄存器之前,必须再次执行有效的Password Access。
在这里插入图片描述
只有bit1必须为1,其他32bit可以用户自定义。
对该寄存器执行写操作后,该寄存器重新被lock住,在次经过Check Access操作后,才可以重新写入。

5.4 总结

进行Password Access(解锁CON0寄存器)后,必须在较短的时间写进行Modify Access,否则会触发Alarm报警。
若Password Access时写入错误的密码,CON0寄存器值保持不变,看门口定时器进入预警模式,并最终触发复位。

5.4.1 清除ENDINIT流程

在这里插入图片描述

5.4.2 设置ENDINIT流程

在这里插入图片描述
喂狗流程也是这样,Modify Access时会重新写入REL(加载值)

6. Timer

Safety Watchdog 和CPU0的定时器在应用程序复位后自动激活。每个实现定时器功能的16位计数器由fspb/ 64、fspb/256或fspb/16384触发。三种配置通过位WDTxCON1.IRx 控制。如表266所示:
在这里插入图片描述
每个WDT前的时钟分频器提供三个WDT计数器频率,fSPB / 64,fSPB / 256和fSPB / 16384。看门狗超时时间的一般计算公式为:在这里插入图片描述
参数startvalue表示计算超时时间的固定值FFFCH,用户可编程的重新加载值WDTxCON0.REL用于计算正常周期。
divider 参数表示IRx选择的用户可编程源时钟分频,可以是64、256或16384。

6.1. Timer Modes

每个看门狗定时器可以在三种不同的工作模式之一:

  • 超时模式(time-out mode)
  • 正常模式
  • 禁用模式
    下面概述了这些模式,以及WDT如何从一种模式切换到另一种模式。

6.1.1 Time-Out Mode

CPU0应用复位后进入WDT超时模式。“应用复位”后会禁用其他CPU。当对WDTxCON0执行有效的Password Access时,也会进入超时模式。Time-Out Mode用WDTxSR.TO = 1表示。计时器设置为0xFFFCH并开始向上计数。只有设置ENDINIT = 1并设置正确的访问顺序,“超时模式”才能正常退出。如果对WDT进行了错误的访问,或者在设置ENDINIT之前定时器溢出,则向SMU (Safety Management Unit)发送告警请求。
根据禁用请求位WDTxCON1.DR的状态,退出超时模式可以是正常模式,也可以是禁用模式。

6.1.2 Normal Mode

在正常模式下(DR = 0), WDT以标准看门狗方式工作。定时器设置为WDTxCON0.REL,并开始计数。必须在计数器溢出之前进行喂狗。喂狗是通过对控制寄存器WDTxCON0的适当访问顺序进行的。
如果WDT在计时器溢出之前没有得到喂狗,则假定系统发生故障。Normal Mode终止,并向安全管理单元(SMU)发送报警请求。

6.1.3 Disable Mode

应用复位后,除CPU0外,所有CPU WDT都处于禁用状态。为不需要WDT功能的应用程序提供了禁用模式。当设置了禁用请求位WDTxCON1.DR时,可以从“超时模式”中请求。当请求时进入禁用模式,并且设置了位WDTxCON0.ENDINIT。定时器在此模式下停止。但是,关闭WDT只会使其停止执行标准的看门狗功能,不需要对WDT进行喂狗服务。它不会禁用超时模式。如果以禁用模式访问WDTxCON0寄存器,如果访问有效,则进入超时模式,如果访问无效,则向SMU (Safety Management Unit)发送告警请求。因此,ENDINIT监视器功能以及(一部分)系统故障检测仍将处于活动状态。

6.1.4 WDT状态机

  • 进入Time Out模式条件:复位后进入,在Normal、Disable模式下执行Password Access也会进入
  • 进入Normal mode条件:执行Password Access(解锁写保护),写入新的密码和重载值,清除-ENINIT,设置DR=0(请求使能WDTx模块),设置ENINIT标志
  • 进入Disable mode条件,执行Password Access(解锁写保护),写入新的密码和重载值,清除ENINIT,设置DR=1(请求禁用WDTx模块),设置ENINIT标志
  • SMU Alarm:超时或者写入无效的访问都会进入
    在这里插入图片描述

6.1.5 总结

1)上电复位后自动进入“Time out mode”,计数器按照最慢的时钟进行计数
2)超时模式中止后,进入“Normal mode”,进入方式如下

  • 正确的密码访问WDT_CON0(对应上面的Check Access)
  • 对WDT_CON0寄存器进行Modify Access访问,将重载值设置为REL_1, ENDINIT设置为1

3)正确的密码访问WDT_CON0。会终止Normal mode,进入Time out mode
4)重复2的过程,从新设置ENDINIT为1,设置重载值为REL_2,结束Time out mode,进入Normal Mode
5)定时器一直计数到0xFFFF,触发一个Alarm请求,启动SMU内部的Recovery Timer开始计数,Recovery Timer超时后,触发复位信号,复位WDT模块。
在这里插入图片描述
备注:
1、Time out mode永远都是从0xFFFC开始计数。
2、Clear ENDINIT会进入Time out mode, Set ENDINIT进入Normal mode
3、启动Watchdog后,WDG模块内部会定时喂狗,用户不用关心

6.2 WDT Alarm Request

SMU alarm 请求包含以下三种情况:

  • 无效的数据写入 WDTxCON0 (x=CPUy and y=CPU number, or S) , SEICON0 or EICON0寄存器(例如密码错误)
  • 在任何WDT、ENDINIT超时计数器或Safety ENDINIT超时计数器的超时模式中,定时器溢出之前不执行Password Access(喂狗操作)
  • 在正常模式下定时器溢出之前不提供任何WDT喂狗操作

由此产生的报警响应(Trap, Reset等)可在安全管理单元(SMU)内编程。

注意:WDT本身通过Application Reset来重置。

6.3 Servicing the Watchdog Timer

如果在应用程序中使用WDT并且WDTxSR.DS = 0,则必须定期维护(喂狗),防止超时溢出。喂狗分两个步骤执行,一个是有效的Password Access,然后是有效的Modify Access。有效的密码访问WDTxCON0会自动将WDT切换为超时模式。因此,Modify Access必须在超时时间之前执行,否则会向SMU (Safety Management Unit)发送告警请求。

注意:为了执行正确的服务,必须将ENDINIT写入为1,即使它已经设置为1。

7. Demo

7.1 Watchdog_1_KIT_TC375_LK

使用CPU0看门狗,演示喂狗功能,正常情况下,1.3s内进行喂狗,CPU正常工作。可修改71行函数,延时周期时间乘2,修改为2s,MCPU会不断复位。
在这里插入图片描述

71行wait函数可参考STM模块,相关链接如下:
System Timer (STM)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2177761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

点餐小程序实战教程13餐桌管理

目录 1 创建数据源2 搭建管理后台3 生成餐桌码4 找到自己的appid和secret5 小程序里获取餐桌信息总结 我们上一篇介绍了点餐界面的菜品展示功能。现实中如果你去餐馆用餐,总是给餐桌贴一个二维码,服务员会告诉你扫码点餐。 扫码大家现在都已经非常熟练了…

“从零开始学排序:简单易懂的算法指南“

“一辈人有一辈人要做的事!!!” 这一期的节目呢,是关于排序的内容,相信大家对此一定很熟悉吧! 排序: 排序是将一组元素按照一定的规则或标准进行组织和排列的过程。 冒泡排序: 冒…

此连接非私人连接

当你手机浏览器输入网站打开提示“此连接非私人连接,此网站可能在冒充来窃取你的个人或财务信息。你应回到之前的页面”这是因为该网站的SSL数字证书到期导致,需要此网站的管理员重新申请数字证书替换之前的文件才可以实现。 注意:如果你不是…

Token: 数据库、存储系统和API安全的应用

一. Token Token是一种常见的计算机术语,它在不同的上下文中有不同的含义。在身份验证和授权的上下文中,Token通常指的是服务端生成的一串字符串,作为客户端进行请求的一个令牌。当用户登录后,服务器会生成一个Token并返回给客户…

【高阶数据结构】平衡二叉树(AVL)的删除和调整

🤡博客主页:醉竺 🥰本文专栏:《高阶数据结构》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多《高阶数据结构》点击专栏链接查看&a…

记一次教学版内网渗透流程

信息收集 如果觉得文章写的不错可以共同交流 http://aertyxqdp1.target.yijinglab.com/dirsearch dirsearch -u "http://aertyxqdp1.target.yijinglab.com/"发现 http://aertyxqdp1.target.yijinglab.com/joomla/http://aertyxqdp1.target.yijinglab.com/phpMyA…

DialFRED基准:具有对话能力的具身智能Agent

目录 一、DialFRED数据集1.1 数据集规模与任务结构1.2 任务实例的构成1.3 人类标注的问答数据1.4 Oracle自动生成答案1.5 任务多样性与数据增强1.6 数据集的词汇多样性1.7 任务和环境的多样性 二、提问者-执行者框架2.1 框架概述2.2 提问者模型设计2.3 执行者模型设计2.4 强化学…

【读书笔记-《30天自制操作系统》-25】Day26

本篇仍然是围绕着命令行窗口做文章。首先优化命令行窗口的移动速度,然后增加多个命令行窗口功能。接着优化了命令行窗口的关闭,最后增加了两个命令start与ncst。 1. 优化命令行窗口移动速度 首先对命令行窗口的移动速度进行优化。主要的优化点有以下几…

WEB服务器——Tomcat

服务器是可以使用java完成编写,是可以接受页面发送的请求和响应数据给前端浏览器的,而在开发中真正用到的Web服务器,我们不会自己写的,都是使用目前比较流行的web服务器。 如:Tomcat 1. 简介 Tomcat 是一个开源的轻量…

二维数组的存放

今天我水的文章是二维数组的存放 二维数组的存放方式其实和一维数组没有区别&#xff0c;但如果想要更直观的了解&#xff0c;我们可以把它们的地址打印出来。 代码如下&#xff1a; #include <stdio.h> int main() {int arr[3][3];//二维数组&#xff0c;int数组类型…

【高效管理集合】并查集的实现与应用

文章目录 并查集的概念主要操作优化技术应用场景 并查集的实现基本框架并查集的主要接口总体代码 并查集的应用省份的数量等式方程的可满足性 总结 并查集的概念 并查集&#xff0c;也称为不相交集&#xff0c;是一种树形的数据结构&#xff0c;用于处理一些不相交集合的合并及…

ClickHouse | 查询

1 ALL 子句 2 ARRAY JOIN 使用别名 :在使用时可以为数组指定别名&#xff0c;数组元素可以通过此别名访问&#xff0c;但数组本身则通过原始名称访问 3 DISTINCT子句 DISTINCT不支持当包含有数组的列 4 FROM子句 FROM 子句指定从以下数据源中读取数据: 1.表 2.子…

建筑资质应该怎么选?

建筑资质是建筑企业承接工程项目的必备条件&#xff0c;它不仅关系到企业的市场竞争力&#xff0c;还直接影响到企业的经营效益。因此&#xff0c;选择适合自己企业的建筑资质至关重要。以下是一些选择建筑资质时需要考虑的关键因素&#xff1a; 1. 明确企业定位 首先&#x…

金融教育宣传月 | 平安养老险百色中心支公司开展金融知识“消保县域行”宣传活动

9月22日&#xff0c;平安养老险百色中心支公司积极落实国家金融监督管理总局关于开展金融教育宣传月活动的相关要求&#xff0c;联合平安人寿百色中心支公司共同组成了平安志愿者小队&#xff0c;走进百色市四塘镇百兰村开展了一场别开生面的金融消费者权益保护宣传活动。此次活…

如何给你的项目添加测试覆盖率徽章

看完我的测试教程之后&#xff0c;想必大家都能写出一个测试覆盖率极高的小项目了。测试覆盖率既然这么高&#xff0c;不秀一秀岂不是白瞎了&#xff0c;下面我们就来通过第三方服务来给你的项目加上测试覆盖率徽章&#xff0c;涉及到的内容有yaml配置&#xff0c;githubAction…

Vue下载pubsub-js中错误问题解决

错误&#xff1a; 解决方法&#xff1a; 执行&#xff1a; npm config set registry https://registry.npm.taobao.org我执行以上方法后安装成功

关于北斗卫星导航系统,你都了解多少?

北斗卫星导航系统&#xff08;简称“北斗系统”&#xff09;&#xff0c; 英文全称是&#xff1a;Beidou Navigation Satellite System&#xff08;简称&#xff1a;BDS&#xff09;&#xff0c; 研发 的 初衷 是中国着眼于国家安全和经济社会发展需要&#xff0c;选择自主研发…

Java类的生命周期-初始化阶段

Java类的生命周期-初始化阶段 前两篇讲述了类生命周期的加载阶段和连接阶段&#xff0c;那么本篇我们来讲最为重要的初始化阶段&#xff0c;借助字节码文件与大厂面试题更好的理解类的初始化 头篇提到&#xff0c;类的生命周期可疑将他分为五个阶段&#xff0c;本篇要讲述的就是…

RIP路由(已被淘汰)

一、rip 路由原理 RIP&#xff08;Routing Information Protocol&#xff0c;路由信息协议&#xff09;早期的动态路由协议&#xff0c;被广泛应用于TCP/IP网络中&#xff0c;尤其是在中小型网络中。基于距离矢量&#xff08;Distance-Vector&#xff09;算法来计算到达目的网络…

农场小程序带你走进生态农产品的世界

在快节奏的现代生活中&#xff0c;人们对食品安全的关注日益增强&#xff0c;对环境、健康农产品的需求也愈发迫切。然而&#xff0c;传统农产品市场往往信息不透明&#xff0c;消费者难以直接了解农产品的生长环境和生产过程&#xff0c;导致信任缺失。而农场小程序的出现&…