TDA4功能安全模块SDL

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

  • 16
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值