TDA4 功能安全模块SDL

您所在的位置:网站首页 经典空镜头分析 TDA4 功能安全模块SDL

TDA4 功能安全模块SDL

#TDA4 功能安全模块SDL| 来源: 网络整理| 查看: 265

SDL

全称Software Diagnostic Library TI提供的安全检测机制的模块,基于下面必需绿色框的模块,可以看出整个调用关系以及依赖。 在这里插入图片描述

编译支持

在这里插入图片描述

ESM

ESM在我现在调试下来的环境下,这个模块可以理解为对所有的错误的总结与反馈,通过内部自定义函数SDL_ESM_applicationCallbackFunction或者外部Error Pin的方式作为反馈给用户的接口。详细介绍通过下面其他模块一一讲解。

VTM

VTM全称Voltage and Thermal Management主要用于监测CPU温度。 编译路径:

${SDK}/sdl

编译命令:

make sdl_vtm_test_app PROFILE=release SOC=j784s4

生成镜像路径:

${SDK}/sdl/binary/sdl_vtm_test_app/bin/j784s4

代码详解

上述我们介绍了大多数模块都是通过ESM模块反应,下面说说ESM的配置属性。 在这里插入图片描述 enableBitmap监视事件的使能位,priority监视事件的优先级,errorpin监视事件是否通过error pin反馈。 每个bit的对应关系参考sdlr_intr_XXXXX_esm0.h,总共128个可监视事件,具体参考如下:

在这里插入图片描述 回到正题根据具体配置的截图可以到errorpinBitmap属性配置的是0xFFFFFCFF,与上面使能0xFFFFFFFF少了2个bit,查看sdlr_intr_XXXXX_esm0.h,看到bit 8 bit9事件没有使能与注释代码相同,并且注释掉的两个LT_TH0,GT_TH1两个事件,低于TH0代表正常CPU的温度提醒,GT_TH1代表过温CPU的温度提醒,GT_TH2代表严重CPU的温度提醒,级别分别对应:Info Warning Critical。 在这里插入图片描述

API详解

初始化函数

SDL_VTM_initTs(SDL_VTM_INSTANCE_TS_0 , &cfgTs);

VTM设置三个参考电压lt_thr0_offset,gt_thr1_offset,gt_thr2_offset,三个电压都为相对值并非绝对值。

vtmTriggerTh(-4000, -2000, 5000);

获取CPU电压函数。

SDL_VTM_getSensorStatus(insTs, &readCtrl, &statusVal);

AD值转换温度值,单位为毫度。

(void) SDL_VTM_tsConvADCToTemp (adc_code_read, insTs,&temp_milli_degrees_read);

关闭三个事件的中断。

SDL_VTM_intrCntrl(SDL_VTM_INSTANCE_VD_DOMAIN_1, ctrl);

温度值转换为AD值。

SDL_VTM_tsConvTempToAdc(lt_thr0_val, insTs, &adc_code_lt_thr0);

设置三个临界值。

setAllVTMTempThr(adc_code_lt_thr0, adc_code_gt_thr1, adc_code_gt_thr2); DEBUG结果

lt_thr0_val = temp_milli_degrees_read + lt_thr0_offset; 82682-4000 /*System running at a safe temperature */ gt_thr1_val = temp_milli_degrees_read + gt_thr1_offset; 82682-2000 /*System should take action to implement system cooling */ gt_thr2_val = temp_milli_degrees_read + gt_thr2_offset; 82682+5000 /*System should take critical action to implement system cooling */

CCM

当CPU处于锁步的情况下用来监测CPU和VIM,来判断CPU是否运行正常。这个模块对于第一次接触似乎有些抽象,有些关键的名词需要理解。参考章节TRM 6.3.3.5 R5FSS Lockstep Error Detection Logic。重要的事情说三遍:SDK现只支持MCU1_0R5锁步测试 SDK现只支持MCU1_0R5锁步测试 SDK现只支持MCU1_0R5锁步测试

Inactivity monitoring

对应CCM监视模式SDL_CCM_MONITOR_TYPE_INACTIVITY_MONITOR,这个主要监测CPU1的情况。在锁步的模式下CPU0处于活动核,CPU1本身不会触发任何事件用于监测CPU0运行状况,所以这个事件我们就可以理解出在锁步模式下,CPU1异常执行事件。 在这里插入图片描述

CPU output compare

CPU compare block拥有四个模式: 在这里插入图片描述

Compare Block Active Mode

在比较块活动模式下,比较两个cpu的输出信号。

Self Test Mode

当进入到自检模式,如果检测到故障,则设置自检错误标志位(STE1),如果故障产生立即终止自检。如果没有产生故障,则设置自检完成标志(STC1)。我们需要轮询查找自检状态,如果终止自检或者完成自检,仍然保持自检模式,并且处于idle模式。

Error Forcing Mode

错误强制模式类似于自检模式,在R5 CPU信号端注入一个不相等的向量。错误强制模式不是设置自测错误标志,自己检测结果。而是强制比较不匹配设置比较错误标志CMPE1并判断错误信号。

Self Test Error Forcing Mode

在自检错误强制模式下,在自检错误信号处强制产生一个错误。比较单元仍然在锁步模式下运行,并且在一个时钟周期后将密钥切换到锁步模式。核心比较禁用信号在进入时断言,完成时解除断言。

代码详解

编译路径同VTM。 编译命令:

make cpu_app PROFILE=release SOC=j784s4

生成镜像路径:

${SDK}/sdl/binary/cpu_app/bin/j784s4

先说说这个Demo的坑,这个Demo我默认编译完成之后,发现会进入异常并且不能进入main函数。那就只能通过移植代码到现有的freertos可运行的环境,慢慢排查看看集成到哪里存在问题。 先说说集成sdl对应所需要的对应的lib文件和.h文件。 makefile .h文件添加:

ifeq ($(SOC),$(filter $(SOC), j784s4)) SDK_INSTALL_PATH = $(abspath $(PDK_INSTALL_PATH)../../..) SDL_INSTALL_PATH = $(SDK_INSTALL_PATH)/sdl INCDIR += $(SDL_INSTALL_PATH)/src/sdl INCDIR += $(SDL_INSTALL_PATH)/src/ip INCDIR += $(SDL_INSTALL_PATH) INCDIR += $(SDL_INSTALL_PATH)/src/sdl INCDIR += $(SDL_INSTALL_PATH)/include INCDIR += $(SDL_INSTALL_PATH)/include/soc/$(SOC) INCDIR += $(SDL_INSTALL_PATH)/src/ip/r5 INCDIR += $(SDL_INSTALL_PATH)/test/osal endif

makefile .lib文件添加:

ifeq ($(SOC),$(filter $(SOC), j784s4)) EXT_LIB_LIST_COMMON += $(SDL_INSTALL_PATH)/binary/src/ip/r5/lib/$(SOC)/r5f/$(BUILD_PROFILE)/r5f_core.$(LIBEXT) EXT_LIB_LIST_COMMON += $(SDL_INSTALL_PATH)/binary/src/ip/lib/$(SOC)/r5f/$(BUILD_PROFILE)/sdl_ip.$(LIBEXT) EXT_LIB_LIST_COMMON += $(SDL_INSTALL_PATH)/binary/src/sdl/lib/$(SOC)/r5f/$(BUILD_PROFILE)/sdl_api.$(LIBEXT) EXT_LIB_LIST_COMMON += $(SDL_INSTALL_PATH)/binary/osal/lib/$(SOC)/r5f/$(BUILD_PROFILE)/sdl_osal.$(LIBEXT) endif

在上面我们讲到了CCM这个模块运行的前提一定要配置锁步,这个DEMO默认已经配置了锁步。教大家如何确认锁步是否配置成功,生成的app镜像在地址0x10上可以看到对应的CPUID 0x1B转10进制就是27,也就是MCU1_0的lockstep ID。 在这里插入图片描述 集成好之后,我进行了一次测试发现可以打印CCM初始化代码,没有任何问题。那就说明还是编译的时候发生了问题,通过查看MAP文件发现有问题的代码ATCM空间使用了很多,通过段属性找到对应的文件。最后在对应的lds文件中补充上面所缺失的section再次运行,启动失败现象消失了。 在这里插入图片描述 回归正题分析一下整个代码的运行过程。初始化依然调用ESM初始化接口,这个Demo的特殊之处初始化了MCU,WKUP,MAIN 三个domain。根据官方API只需要MCU domain接口,我自己实测了下确实只需要MCU,并且这个DEMO重复初始化了。整个模块的最小系统还是参考下面介绍:

${SDK}/sdl/sdl_docs/userguide/j784s4/modules/r5fccm.html

看了半天API根据TI现在提供的代码只提供了Self test模式也满足了我们现阶段需求。与VTM模块ESM配置的区别,这次我们多了esmErrorConfig属性。这个属性会影响到调用call_back函数。实际调试下来并没有进入到这里,我改成0,0也没有对这个case产生影响。 在这里插入图片描述 SDL_ESM_processInterruptSource 在这里插入图片描述 把代码进行了精简也进行了测试功能正常,SDL_CCM_INIT里面的注册callback未使用。

SDL_ESM_init(SDL_ESM_INST_MCU_ESM0, &CCM_Test_esmInitConfig_MCU, SDL_ESM_applicationCallbackFunction, ptr); testResult = SDL_CCM_init(SDL_CCM_MCU_R5F0); if(testResult == SDL_PASS) { testResult = SDL_CCM_verifyConfig(SDL_CCM_MCU_R5F0); if(testResult == SDL_PASS) { testResult = SDL_CCM_selfTest(SDL_CCM_MCU_R5F0,SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK,SDL_CCM_SELFTEST_TYPE_NORMAL, 0U,10000000); if(testResult == SDL_PASS) { UART_printf("\n R5F-CPU example application CCM inject error: test starting"); testResult = SDL_CCM_injectError(SDL_CCM_MCU_R5F0, SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK); if (testResult != SDL_PASS ) { UART_printf("\n R5F-CPU example application CCM inject failed"); } else { UART_printf("\n R5F-CPU example application CCM inject Test complete"); } } } } API详解

初始化函数:

SDL_ESM_init(SDL_ESM_INST_MCU_ESM0, &CCM_Test_esmInitConfig_MCU, SDL_ESM_applicationCallbackFunction, ptr); SDL_ESM_init(SDL_ESM_INST_MAIN_ESM0, &CCM_Test_esmInitConfig_MAIN,SDL_ESM_applicationCallbackFunction,ptr); SDL_ESM_init(SDL_ESM_INST_WKUP_ESM0, &CCM_Test_esmInitConfig_WKUP, SDL_ESM_applicationCallbackFunction,ptr);

CPU output compare selftest模式函数:SDL_CCM_SELFTEST_TYPE_ERROR_FORCING产生错误。从下面的log可以看出调用函数之后会立即callback函数产生。 监视错误类型:

SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK SDL_CCM_MONITOR_TYPE_VIM SDL_CCM_MONITOR_TYPE_INACTIVITY_MONITOR

SDL_CCM_selfTest(SDL_CCM_MCU_R5F0,SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK,SDL_CCM_SELFTEST_TYPE_NORMAL, 0U,10000000);/*进入selftest模式*/ SDL_CCM_selfTest(SDL_CCM_MCU_R5F0,SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK,SDL_CCM_SELFTEST_TYPE_ERROR_FORCING,0U,10000000);/*self test模式强制错误产生*/

注入错误函数:从log中可以看出产生了两次callback函数。一次是self_test_callbcak,另外一个词是compare_err_callback

SDL_CCM_injectError(SDL_CCM_MCU_R5F0, SDL_CCM_MONITOR_TYPE_OUTPUT_COMPARE_BLOCK);

错误类型获取:获取三个对应CCM的错误中断源,可以看出这三个都属于MCU domain。

SDL_ESM_MCU_R5_CPU_BUS_CMP_ERR SDL_ESM_MCU_R5_VIM_BUS_CMP_ERR_INT SDL_ESM_MCU_R5_INACTIVITY_ERR_INT

转换成ESM错误类型:

SDLR_MCU_ESM0_ESM_PLS_EVENT0_MCU_R5FSS0_COMMON0_SELFTEST_ERR_PULSE_0 (96)/self test/ SDLR_MCU_ESM0_ESM_PLS_EVENT0_MCU_R5FSS0_COMMON0_COMPARE_ERR_PULSE_0 (97) SDLR_MCU_ESM0_ESM_PLS_EVENT0_MCU_R5FSS0_COMMON0_VIM_COMPARE_ERR_PULSE_0 (99) SDLR_MCU_ESM0_ESM_PLS_EVENT0_MCU_R5FSS0_COMMON0_BUS_MONITOR_ERR_PULSE_0 (98)

SDL_CCM_getErrorType(SDL_CCM_MCU_R5F0, intSrc, &monitorType);

清除错误:

SDL_CCM_clearError(SDL_CCM_MCU_R5F0, monitorType); DEBUG结果

mcuClkFreq 1000000000 R5 CPU Application R5F-CPU example application CCM_Test_init: Init MCU ESM complete R5F-CPU example application CCM_Test_init: Init MAIN ESM complete R5F-CPU example application CCM_Test_init: Init WKUP ESM complete CCM_Test_init: CCM Init complete R5F-CPU example application CCM_Test_init: CCM Init complete CCM Functional Test R5F-CPU example application CCM_Test_init: Init MCU ESM complete R5F-CPU example application CCM_Test_init: Init MAIN ESM complete R5F-CPU example application CCM_Test_init: Init WKUP ESM complete CCM_Test_init: CCM Init complete R5F-CPU example application CCM_Test_init: CCM Init complete R5F-CPU example application CCM self test: starting R5F-CPU example application CCM Self Test complete R5F-CPU example application CCM self test with error forcing: starting ESM Call back function called : instType 0x2, intType 0x1, grpChannel 0x3, index 0x0, intSrc 0x60 Take action R5F-CPU example application CCM Self Test with error forcing complete R5F-CPU example application CCM inject error: test starting ESM Call back function called : instType 0x2, intType 0x1, grpChannel 0x3, index 0x0, intSrc 0x60 Take action ESM Call back function called : instType 0x2, intType 0x1, grpChannel 0x3, index 0x1, intSrc 0x61 Take action R5F-CPU example application CCM inject Test complete R5F-CPU example application MPU self test for Mem Write Access Fault: starting R5F-CPU example application MPU self test for Mem Write Access Fault complete Cycles taken 13680 R5F-CPU example application MPU self test for Mem Read Access Fault: starting R5F-CPU example application MPU self test for Mem Read Access Fault complete Cycles taken 3145 R5F-CPU example application MPU self test for Mem Write Access Fault (Wait Forever): starting R5F-CPU example application MPU self test for Mem Write Access Fault (Wait Forever) complete Cycles taken 3482 R5F-CPU example application MPU self test for Mem Read Access Fault (Wait Forever): starting R5F-CPU example application MPU self test for Mem Read Access Fault (Wait Forever) complete Cycles taken 2903 CPU Functionality Passed. All tests have passed. main.c:239:test_sdl_cpu_test_app:PASS 1 Tests 0 Failures 0 Ignored OK



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3