Bootloder开发方案(基于UDS)

         Bootloader是所有支持重编程的ECU必须具备的软件功能,在ECU运行过程中,执行的是应用软件和应用数据,仅当应用软件或应用数据无效时,或者要求对其进行升级或特殊测试的时候,Bootloader软件才被激活。

         应用软件和应用数据可以同时编程或者相互独立编程,不允许重新编程时更新Botloader软件。Bootloader软件存储于被保护的存储器区域,即使发生潜在错误时,控制器始终保证可重新编程。

  1. 2.1.1    安全机制

为确保下载的安全,ECU需设计安全机制,避免以下几种情况:

a.       来自非法源的下载动作;

b.       当前刷新条件不满足;

c.       下载错误的应用软件或应用数据到ECU

d.       软件之间不兼容;

1.2.1.1.1安全访问

         ECU通过SEED&KEY机制进行安全访问服务限制,保证ECU免遭未授权的编程动作影响。

1.2.1.1.2 刷新预条件

         ECU确保刷新时处于安全状态,条件不满足(如高压上电或车辆运行)时,刷新服务请求将被拒绝。

1.2.1.1.3 完整性校验

         ECU对即将下载到存储器的程序或数据进行完整性检查,当一个逻辑模块下载后,使用CRC32算法验证当前逻辑块的所有数据字节是否被正确传输和写入。通过“检查编程完整性”例程控制激活ECU完整性校验。当ECU接收到此服务请求时,Bootloader将计算下载数据字节的CRC32值,并将计算结果与诊断仪请求报文中发送的校验值进行比较。

1.2.1.1.4 一致性检查

         不兼容的软件不能配合使用,如果配合使用可能会使功能异常或产生致命性错误。为此,ECU通过验证软件兼容性来检查刷新程序的一致性,包括应用软件与Bootloader软件、应用数据与应用软件检验等。

1.2.1.1.5 有效性检查

         ECU内部有一个标志位,用于标识应用软件是否有效。如果刷新完整性检查和一致性检查都正确时,ECU才会设置应用软件的标志位为有效。只有标志位为有效时,应用软件才可以运行。

  1. 2.1.2    刷新文件格式

刷新文件格式为Intel格式(*.hex)

  1. 2.1.3    ECU启动时序

在每次上电/复位后,ECU首先执行Bootloader代码。Bootloader首先执行一些基本的初始化,然后检查刷新请求标志位是否为有效,如果刷新请求标志位有效,即使应用程序是有效的,Bootloader也会继续运行。如果当前没有刷新请求,即刷新请求标志位为无效,则检查应用软件的状态,如果应用软件是有效的,则应用软件代码将被执行,如果应用软件是无效的,则继续执行Bootloader代码。

3-2 ECU启动时序

  1. 2.1.4    刷新流程
  2. 2.1.4.1          Bootloader启动时序

3-3描述了Bootloader启动时序。在应用模式下,使用了两种不同的诊断会话模式:默认会话模式和扩展会话模式。

Bootloader模式下,使用了三种不同的诊断会话模式:默认会话模式,扩展会话模式和刷新会话模式。

如果ECU在正确的条件下收到“10 02”指令,ECU将外部刷新请求标志位设置为有效,并执行ECU重启。

3-3 Bootloader启动时序

         上电/复位后,ECU首先执行Bootloader引导代码,然后检查外部刷新请求标志位:

  • 如果外部刷新请求标志位为有效,那么即使应用程序是有效的,Bootloader也会继续进一步执行,在此情况下,ECU直接进入编程会话模式。
  • 如果外部重编程请求标志位为无效,则继续检查应用软件的标志位状态:

•       如果应用软件是有效的,则启动应用模式;

•       如果应用软件无效,ECU停留在Bootloader模式下的默认会话模式。

Bootloader模式下,有以下几种方式,会导致ECU重启:

Ø 无论当前处于何种会话模式,“11h 01h”都会引导ECU重启;

Ø 在扩展会话模式或编程会话模式下,S3定时器超时会导致ECU重启;

Ø 在编程会话模式下,“10h 01h”会导致ECU重启。

  1. 2.1.4.2          刷新时序

刷新时序分为三个编程步骤:

  • 预刷新步骤:刷新前的CAN网络准备;
  • 主刷新步骤:下载应用软件或应用数据;
  • 后刷新步骤:重同步CAN网络。

如果在预刷新、主刷新和后刷新步骤过程中,任何物理寻址的请求及响应不满足要求,则全部时序需被再次执行。

  • 预刷新步骤

预刷新步骤用来为要下载的ECU做重刷新前的CAN网络准备。此步骤也包含了提高下载速度的准备。此步骤的请求报文能采用的是物理寻址,或功能寻址。预刷新步骤,如图3-4所示。

图3-4 预刷新步骤

  1. a)  诊断会话控制10h 03h:为了禁止ECU间的正常通信和控制DTC设置,预刷新需要启动非默认会话模式。通过使用会话类型为扩展会话模式的诊断会话控制(10h)服务来完成。此请求使用一个单帧请求报文,通过功能寻址发送给所有的ECU
  2. b)  例程控制“检查刷新预条件”31h01h FFh 02h:通过此例程来检查ECU刷新条件,从而确保系统安全,如果有任何不安全的因素,ECU将拒绝刷新。

注意:如果ECU在未收到“检查刷新预条件”例程(31h 01h FFh 02h)的情况下,收到“10h 02h”请求,ECU将拒绝进入Bootloader模式,并且发送否定响应。

  1. c)  控制DTC设置85h 02h:诊断仪通过DTC设置类型设为“关闭”的控制DTC设置服务请求。此请求使用一个单帧请求报文,通过功能寻址发送给所有的ECU
  2. d)  通信控制28h 03h 03h:诊断仪通过通信控制(28h)服务请求,禁止非诊断报文的发送和接收。请求中的控制类型参数置为“disable the transmissionand the reception”,通信类型置为“application and network management messages”。此请求使用一个单帧请求报文,通过功能寻址发送给所有的ECU
  3. e)  读取数据22h xxh yyh:在禁止正常通信后,读取被刷新的ECU的状态(如:刷新的应用软件和数据)。从被刷新的ECU读取服务器标识数据,如应用软件标识、应用数据标识、Bootloader软件标识。
  4. 2)       主刷新步骤

在预刷新步骤之后,是主刷新步骤。主刷新时序是单个ECU刷新事件的应用,因此所有服务的请求都使用物理寻址。

3-5描述了在主刷新步骤中执行的各个服务。

图3-5 主刷新步骤

  1. a)  诊断会话控制10h 02h:在收到一个寻址方式为物理寻址,子功能为刷新会话的诊断会话控制(10h)服务后,ECU启动Bootloader,并分配刷新所需的所有资源。ECU需先发送肯定响应再执行跳转到刷新模式动作。
  2. b)  安全访问27h 03h/04h:刷新事件必须通过安全访问。安全访问(27h)服务在排放相关和安全系统中是强制的。其它系统不要求使用该服务。下载前,通过安全访问过程是强制的,确保只有合法的诊断仪能对ECU进行下载操作。

为了缩短重刷新时间,上电可直接执行安全访问服务。

 

3-3描述了Bootloader启动时序。在应用模式下,使用了两种不同的诊断会话模式:默认会话模式和扩展会话模式。

Bootloader模式下,使用了三种不同的诊断会话模式:默认会话模式,扩展会话模式和刷新会话模式。

如果ECU在正确的条件下收到“10 02”指令,ECU将外部刷新请求标志位设置为有效,并执行ECU重启。

3-3 Bootloader启动时序

         上电/复位后,ECU首先执行Bootloader引导代码,然后检查外部刷新请求标志位:

 

•       如果应用软件是有效的,则启动应用模式;

•       如果应用软件无效,ECU停留在Bootloader模式下的默认会话模式。

Bootloader模式下,有以下几种方式,会导致ECU重启:

Ø 无论当前处于何种会话模式,“11h 01h”都会引导ECU重启;

Ø 在扩展会话模式或编程会话模式下,S3定时器超时会导致ECU重启;

Ø 在编程会话模式下,“10h 01h”会导致ECU重启。

 

刷新时序分为三个编程步骤:

 

如果在预刷新、主刷新和后刷新步骤过程中,任何物理寻址的请求及响应不满足要求,则全部时序需被再次执行。

 

预刷新步骤用来为要下载的ECU做重刷新前的CAN网络准备。此步骤也包含了提高下载速度的准备。此步骤的请求报文能采用的是物理寻址,或功能寻址。预刷新步骤,如图3-4所示。

图3-4 预刷新步骤

 

注意:如果ECU在未收到“检查刷新预条件”例程(31h 01h FFh 02h)的情况下,收到“10h 02h”请求,ECU将拒绝进入Bootloader模式,并且发送否定响应。

 

在预刷新步骤之后,是主刷新步骤。主刷新时序是单个ECU刷新事件的应用,因此所有服务的请求都使用物理寻址。

3-5描述了在主刷新步骤中执行的各个服务。

图3-5 主刷新步骤

 

为了缩短重刷新时间,上电可直接执行安全访问服务。

 

单个应用软件或数据块可能需要多个数据传输(36h)请求报文来完成传输(当数据块长度超出网络层缓存大小时,就会出现这种情况)。

 

通过ECU复位服务请求将使ECU结束重刷新过程,返回到正常的操作模式。内存驱动代码必须从RAM缓存中完全清除,避免意外激活这些可能会进行非预期的内存擦除或程序操作的代码。

 

3-6 后刷新步骤

  1. c)  驱动下载34h36h37h31h:当ECU的非易失性存储单元中没有存储内存驱动时,将执行内存驱动的下载。下载应该按照如下时序来进行:请求下载、传输数据、请求传输退出。下载完所有字节后,用“检查刷新完整性”例程(31h 01h F0h 01h)来检查所有的字节都正确传输。
  2. d)  写入数据2Eh F1h 5Ah:在擦除内存例程之前,将“指纹”写到ECU内存中是强制的。“指纹”标识了是哪个诊断仪对ECU内存做了修改。使用F1h5Ah数据标识符而不是引导软件指纹、应用软件指纹、应用数据指纹这些数据标识符。每个逻辑块(除了驱动)下载前,诊断仪将首先写“指纹”,在下载完逻辑块后,ECU将识别之前下载的程序是哪个逻辑块(即逻辑块序号),并根据逻辑块的序号将它存储。在追踪指纹信息时,诊断仪将发报文“22hF1h 5Bh”,ECU将通过“62h F1h 5Bh…”,返回每一个逻辑块的指纹信息。
  3. e)  例程控制——“擦除内存”31h 01h FFh 00h:为了允许应用软件和数据下载,ECU的内存将被擦除。此步骤通过例程控制服务(31h)来执行擦除内存。如果擦除内存例程被调用执行,那么应用软件的标志位将被置为无效。
  4. f)  下载过程34h36h37h:应用软件或者数据的每一个连续的数据块(也叫段,可能是一个完整的应用软件或者数据,也可能是应用软件或者数据的一部分)下载到ECU非易失性内存中,都是遵循下面的服务顺序完成数传输:
  5. Ø 请求下载(34h);
  6. Bootloader

             Bootloader是所有支持重编程的ECU必须具备的软件功能,在ECU运行过程中,执行的是应用软件和应用数据,仅当应用软件或应用数据无效时,或者要求对其进行升级或特殊测试的时候,Bootloader软件才被激活。

             应用软件和应用数据可以同时编程或者相互独立编程,不允许重新编程时更新Botloader软件。Bootloader软件存储于被保护的存储器区域,即使发生潜在错误时,控制器始终保证可重新编程。

  7. 2.1.1    安全机制
  8. 为确保下载的安全,ECU需设计安全机制,避免以下几种情况:

    a.       来自非法源的下载动作;

    b.       当前刷新条件不满足;

    c.       下载错误的应用软件或应用数据到ECU

    d.       软件之间不兼容;

    3.2.1.1.1安全访问

             ECU通过SEED&KEY机制进行安全访问服务限制,保证ECU免遭未授权的编程动作影响。

    3.2.1.1.2 刷新预条件

             ECU确保刷新时处于安全状态,条件不满足(如高压上电或车辆运行)时,刷新服务请求将被拒绝。

    3.2.1.1.3 完整性校验

             ECU对即将下载到存储器的程序或数据进行完整性检查,当一个逻辑模块下载后,使用CRC32算法验证当前逻辑块的所有数据字节是否被正确传输和写入。通过“检查编程完整性”例程控制激活ECU完整性校验。当ECU接收到此服务请求时,Bootloader将计算下载数据字节的CRC32值,并将计算结果与诊断仪请求报文中发送的校验值进行比较。

    3.2.1.1.4 一致性检查

             不兼容的软件不能配合使用,如果配合使用可能会使功能异常或产生致命性错误。为此,ECU通过验证软件兼容性来检查刷新程序的一致性,包括应用软件与Bootloader软件、应用数据与应用软件检验等。

    3.2.1.1.5 有效性检查

             ECU内部有一个标志位,用于标识应用软件是否有效。如果刷新完整性检查和一致性检查都正确时,ECU才会设置应用软件的标志位为有效。只有标志位为有效时,应用软件才可以运行。

  9. 2.1.2    刷新文件格式
  10. 刷新文件格式为Intel格式(*.hex)

  11. 2.1.3    ECU启动时序
  12. 在每次上电/复位后,ECU首先执行Bootloader代码。Bootloader首先执行一些基本的初始化,然后检查刷新请求标志位是否为有效,如果刷新请求标志位有效,即使应用程序是有效的,Bootloader也会继续运行。如果当前没有刷新请求,即刷新请求标志位为无效,则检查应用软件的状态,如果应用软件是有效的,则应用软件代码将被执行,如果应用软件是无效的,则继续执行Bootloader代码。

    3-2 ECU启动时序

  13. 2.1.4    刷新流程
  14. 2.1.4.1          Bootloader启动时序
  15. 如果外部刷新请求标志位为有效,那么即使应用程序是有效的,Bootloader也会继续进一步执行,在此情况下,ECU直接进入编程会话模式。
  16. 如果外部重编程请求标志位为无效,则继续检查应用软件的标志位状态:
  17. 2.1.4.2          刷新时序
  18. 预刷新步骤:刷新前的CAN网络准备;
  19. 主刷新步骤:下载应用软件或应用数据;
  20. 后刷新步骤:重同步CAN网络。
  21. 预刷新步骤
  22. a)  诊断会话控制10h 03h:为了禁止ECU间的正常通信和控制DTC设置,预刷新需要启动非默认会话模式。通过使用会话类型为扩展会话模式的诊断会话控制(10h)服务来完成。此请求使用一个单帧请求报文,通过功能寻址发送给所有的ECU
  23. b)  例程控制“检查刷新预条件”31h01h FFh 02h:通过此例程来检查ECU刷新条件,从而确保系统安全,如果有任何不安全的因素,ECU将拒绝刷新。
  24. c)  控制DTC设置85h 02h:诊断仪通过DTC设置类型设为“关闭”的控制DTC设置服务请求。此请求使用一个单帧请求报文,通过功能寻址发送给所有的ECU
  25. d)  通信控制28h 03h 03h:诊断仪通过通信控制(28h)服务请求,禁止非诊断报文的发送和接收。请求中的控制类型参数置为“disable the transmissionand the reception”,通信类型置为“application and network management messages”。此请求使用一个单帧请求报文,通过功能寻址发送给所有的ECU
  26. e)  读取数据22h xxh yyh:在禁止正常通信后,读取被刷新的ECU的状态(如:刷新的应用软件和数据)。从被刷新的ECU读取服务器标识数据,如应用软件标识、应用数据标识、Bootloader软件标识。
  27. 2)       主刷新步骤
  28. a)  诊断会话控制10h 02h:在收到一个寻址方式为物理寻址,子功能为刷新会话的诊断会话控制(10h)服务后,ECU启动Bootloader,并分配刷新所需的所有资源。ECU需先发送肯定响应再执行跳转到刷新模式动作。
  29. b)  安全访问27h 03h/04h:刷新事件必须通过安全访问。安全访问(27h)服务在排放相关和安全系统中是强制的。其它系统不要求使用该服务。下载前,通过安全访问过程是强制的,确保只有合法的诊断仪能对ECU进行下载操作。
  30. c)  驱动下载34h36h37h31h:当ECU的非易失性存储单元中没有存储内存驱动时,将执行内存驱动的下载。下载应该按照如下时序来进行:请求下载、传输数据、请求传输退出。下载完所有字节后,用“检查刷新完整性”例程(31h 01h F0h 01h)来检查所有的字节都正确传输。
  31. d)  写入数据2Eh F1h 5Ah:在擦除内存例程之前,将“指纹”写到ECU内存中是强制的。“指纹”标识了是哪个诊断仪对ECU内存做了修改。使用F1h5Ah数据标识符而不是引导软件指纹、应用软件指纹、应用数据指纹这些数据标识符。每个逻辑块(除了驱动)下载前,诊断仪将首先写“指纹”,在下载完逻辑块后,ECU将识别之前下载的程序是哪个逻辑块(即逻辑块序号),并根据逻辑块的序号将它存储。在追踪指纹信息时,诊断仪将发报文“22hF1h 5Bh”,ECU将通过“62h F1h 5Bh…”,返回每一个逻辑块的指纹信息。
  32. e)  例程控制——“擦除内存”31h 01h FFh 00h:为了允许应用软件和数据下载,ECU的内存将被擦除。此步骤通过例程控制服务(31h)来执行擦除内存。如果擦除内存例程被调用执行,那么应用软件的标志位将被置为无效。
  33. f)  下载过程34h36h37h:应用软件或者数据的每一个连续的数据块(也叫段,可能是一个完整的应用软件或者数据,也可能是应用软件或者数据的一部分)下载到ECU非易失性内存中,都是遵循下面的服务顺序完成数传输:
  34. Ø 请求下载(34h);
  35. Ø 传输数据(36h);
  36. Ø  请求退出传输(37h)。
  37. g)  例程控制——“检查刷新完整性”31h 01h F0h 01h:此例程用来检查逻辑块的完整性。
  38. h)  例程控制——“检查刷新一致性”31h 01h FFh 01h:一旦完成所有的应用软件或数据块/模块的下载,诊断仪将开始一个例程来触发ECU检查重刷新的一致性。
  39. i)  电控单元复位11h 01h:诊断仪使用物理寻址,发送一个复位类型为硬复位的ECU复位(11h)服务请求报文到CAN网络上。
  40. 后刷新步骤
  41. a)  诊断会话控制10h 01h:诊断仪发送一个会话类型为默认会话的诊断会话控制(10h)服务请求报文到CAN网络上。所有的ECU接收到诊断会话控制(10h),而进入到默认会话模式。此请求通过功能寻址发送,请求发送给所有包含在编程事件中或因此而进入非默认会话模式的ECU。跳转到默认会话模式,表示通信控制(28h)服务和控制DTC设置(85h)服务也将复位到默认状态。
  42. b)  清除诊断信息14h FFh FFh FFh:如果重编程ECU在编程步骤被重启,当编程ECU运行在默认会话模式时,网络上其它的ECU仍然在不能正常通信状态,此时,一些可能被存储在编程ECU中的诊断信息就应该通过物理寻址的清除诊断信息(14h)服务来清除。
  43. Ø 传输数据(36h);
  44. Ø  请求退出传输(37h)。

单个应用软件或数据块可能需要多个数据传输(36h)请求报文来完成传输(当数据块长度超出网络层缓存大小时,就会出现这种情况)。

  1. g)  例程控制——“检查刷新完整性”31h 01h F0h 01h:此例程用来检查逻辑块的完整性。
  2. h)  例程控制——“检查刷新一致性”31h 01h FFh 01h:一旦完成所有的应用软件或数据块/模块的下载,诊断仪将开始一个例程来触发ECU检查重刷新的一致性。
  3. i)  电控单元复位11h 01h:诊断仪使用物理寻址,发送一个复位类型为硬复位的ECU复位(11h)服务请求报文到CAN网络上。

通过ECU复位服务请求将使ECU结束重刷新过程,返回到正常的操作模式。内存驱动代码必须从RAM缓存中完全清除,避免意外激活这些可能会进行非预期的内存擦除或程序操作的代码。

  • 后刷新步骤

3-6 后刷新步骤

  1. a)  诊断会话控制10h 01h:诊断仪发送一个会话类型为默认会话的诊断会话控制(10h)服务请求报文到CAN网络上。所有的ECU接收到诊断会话控制(10h),而进入到默认会话模式。此请求通过功能寻址发送,请求发送给所有包含在编程事件中或因此而进入非默认会话模式的ECU。跳转到默认会话模式,表示通信控制(28h)服务和控制DTC设置(85h)服务也将复位到默认状态。
  2. b)  清除诊断信息14h FFh FFh FFh:如果重编程ECU在编程步骤被重启,当编程ECU运行在默认会话模式时,网络上其它的ECU仍然在不能正常通信状态,此时,一些可能被存储在编程ECU中的诊断信息就应该通过物理寻址的清除诊断信息(14h)服务来清除。
  • 8
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 基于udsbootloader开发是指使用统一诊断服务(Unified Diagnostic Services,简称UDS)协议来开发bootloader。UDS是一种用于诊断和编程汽车电子控制单元(ECU)的协议,它提供了一种标准化的方式来进行诊断和编程操作。在基于UDSbootloader开发中,开发人员需要实现UDS协议的相关功能,包括诊断会话管理、诊断服务请求和响应、故障码管理等。同时,还需要考虑到bootloader的安全性和稳定性,确保bootloader能够正确地加载和运行应用程序。 ### 回答2: 基于udsbootloader开发是一种常见的嵌入式系统开发方式,其主要是用于对设备的固件进行升级、修复和更新等操作。uds即Unified Diagnostic Services,它是一种用于汽车电子控制系统(ECU)通信协议的标准化诊断服务,用于实现ECU之间的通信,具有较高的可靠性和实时性。 基于udsbootloader开发需要考虑一些重要的因素,比如性能、稳定性、可靠性、安全性和易用性等。下面对这些因素逐一进行介绍: 1. 性能: 由于升级操作需要在短时间内完成,因此在bootloader实现的时候需要充分考虑性能问题,保证升级速度和效率。 2. 稳定性: 一旦bootloader出错,会对整个系统造成很大的影响。因此,bootloader需要保证其稳定性,尽量避免出现故障或崩溃。 3. 可靠性: 升级是一个对设备十分重要的操作,应该尽可能地减少数据丢失和不稳定性等问题。bootloader应该对升级过程进行有效的控制和检测,保证升级过程的可靠性。 4. 安全性: 当一个设备的固件被升级时,需要保证升级过程和升级的文件是具有完整性和真实性的,否则可能会引入一些潜在的安全风险。因此,bootloader需要具有验证机制,防止出现恶意文件和故意破坏的情况。 5. 易用性: 对于非专业的用户来说,升级设备的过程需要是直观且易于理解的,这将影响用户的体验。因此,bootloader需要提供简单易用的用户界面,使用户可以方便地完成升级操作。 总之,基于udsbootloader开发需要综合考虑以上因素,来完成一个可靠、高效、安全、易用的bootloader系统,从而实现设备升级、修复和更新等操作。 ### 回答3: UDS(Unified Diagnostic Services,译为统一诊断服务)是一种用于汽车电子控制单元(ECU)通讯的协议,它定义了一组诊断服务、数据传输方式以及错误诊断方法。在汽车软件开发中,UDS协议被广泛应用于故障诊断、测试和编程等方面。而基于UDS协议的bootloader开发则是车载软件开发的一个重要环节。 因为车辆电子控制模块(ECM)在生产过程中需要被烧录固件,这就需要一种可靠的bootloader。基于UDSbootloader可以实现更安全、更快速、更灵活的固件升级和诊断,还可以提高软件开发的效率和降低成本。下面,我们来看一下基于UDSbootloader开发的具体步骤: 1. 确定需求和功能:首先需要明确bootloader要实现的功能和性能需求,如支持的ECU类型、诊断服务类型、数据传输速率、错误检测机制等。 2. 设计通讯协议:UDS协议定义了ECU与配套工具之间的通讯协议和规则,我们需要设计一个UDS通讯协议能够满足上述功能和需求的bootloader。 3. 编写bootloader软件:根据设计的通讯协议和功能需求,编写基于UDSbootloader软件,并进行测试验证。 4. 软件验证和优化:在完成软件编写后,需要进行软件验证和优化。验证过程中需要确保软件能够正常工作,并能够稳定地升级固件。优化过程中,则可以根据验证结果对软件进行改进和调整。 5. 集成到系统中:将编写完成的bootloader软件集成到目标系统中,进行进一步的测试和验证。 总之,基于UDSbootloader开发可以帮助实现较高效率和稳定性的固件升级和诊断,减少运营商的负担和成本,对于车载软件开发具有重要的奠基作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_34309267

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值