AURIX TC3xx MCAL中Link文件解析以及代码变量定位方法详解

汽车ECU开发 2021-08-20 07:33


TC3xx系列MCAL中TASKING Link文件解析以及代码变量定位方法


1 TASKING Link文件解析


1.1 DSRAM中的数据存放:


在AURIX™ 2G中(以TC387为例),每个CPU都有自己的PSRAM (又称PSPR)和DSRAM (又称DSPR),它们都是RAM,只不过PSRAM是挂在指令总线上,而DSRAM是挂在数据总线上,因此如果在PSRAM运行代码,DSRAM存放数据,可以达到0 cycle等待。但是PSRAM上也是可能存放数据的,只不过效率低一点。


DSRAM的起始地址如下:


CPU0 DSRAM

0x70000000

CPU1 DSRAM

0x60000000

CPU2 DSRAM

0x50000000

CPU3 DSRAM

0x40000000


MCALTASKING link文件中,对于数据的存放如下图所示:



CSA:


CSA是用来在函数调用或者进出中断时用来保存通用寄存器的区域,具体可到英飞凌官网(www.infineon.com)查看“AURIX™ TC3xx Architecture”用户手册。它的大小由LCF_CSAx_SIZE决定。


ISTACK:


在中断服务程序中使用的栈,它的大小由LCF_ISTACKx_SIZE决定。


USTACK:


在用户程序中使用的栈,它的大小由LCF_USTACKx_SIZE决定。


Heap:


程序中使用的堆,它的大小由LCF_HEAP_SIZE决定。


Predefine Data/Data:


Data区域是用来存放带初始化值的全局变量,在link文件中,这个区域有两种类型,预先定义的区域和默认区域。


预先定义的Data区域,例如.data.Ifx_Ssw_Tc1和.data.Cpu1_Main.*,在cpu1_main.c中如果定义了一个带初始化值的变量,则它会放在DSRAM1中的.data.Cpu1_Main.*段中。


 

group (ordered, attributes=rw, run_addr=mem:dsramx)

        {

          select".data.Ifx_Ssw_Tcx.*";

          select".data.Cpux_Main.*";

          …

}

 


而如果在一个其他.c文件(例如demo.c)中定义了一个带初始化值的变量,则它会放在DSRAM0中data区域(即默认区域),这个由Link文件中下面语句决定:


 

#    if LCF_DEFAULT_HOST == LCF_CPU0

    group (ordered, contiguous, align = 4, attributes=rw, run_addr = mem:dsram0)

#    endif

    {

      group data(attributes=rw)

      {

        select".data.*";

        select".data.farDsprInit.cpu0.32bit";

        select".data.farDsprInit.cpu0.16bit";

        select".data.farDsprInit.cpu0.8bit";

      }

      …

}

 


Predefine BSS/BSS:


BSS区域是用来存放没有初始值的全局变量,在link文件中,这个区域有两种类型,预先定义的区域和默认区域,


预先定义的BSS区域,例如.bss.Ifx_Ssw_Tc1和.bss.Cpu1_Main.*,在cpu1_main.c中如果定义了一个带初始化值的变量,则它会放在DSRAM1中的.bss.Cpu1_Main.*段中。


 

group (ordered, attributes=rw, run_addr=mem:dsramx)

        {

          select".bss.Ifx_Ssw_Tcx.*";

          select".bss.Cpux_Main.*";

          …

}

 


而如果在一个其他.c文件(例如demo.c)中定义了一个不带初始化值的变量,则它会放在DSRAM0中BSS区域(即默认区域),这由Link文件中下面语句决定:


 

#    if LCF_DEFAULT_HOST == LCF_CPU0

    group (ordered, contiguous, align = 4, attributes=rw, run_addr = mem:dsram0)

#    endif

    {

      group bss(attributes=rw)

      {

        select".bss.*";

        select".bss.farDsprClearOnInit.cpu0.32bit";

        select".bss.farDsprClearOnInit.cpu0.16bit";

        select".bss.farDsprClearOnInit.cpu0.8bit";

      }      

 …

}

 


1.2 PFlash中的代码存放


TC3xx的Flash是以3MB或者1MB作为一个Bank,不用Cache的地址从0xA0000000开始,用Cache的地址从0x80000000开始。



在MCAL的Link文件中,常量和代码的存放如下图所示:



Predefined text/text:


Text段用来存放代码,它分为两种:一种是预先定义好的text段,另外一种默认的text段。


预先定义好的text段,例如.text.Cpu1_Main.*,  在Cpu1_Main.c中的代码会放在这个段内。


 

group (ordered, align = 4, run_addr=mem:pflsx)

        {

          select".text.Ifx_Ssw_Tcx.*";

          select".text.Cpux_Main.*";

          select".text.text_cpux*";

          select"*Code.Cpux";

          select"*Code.Fast.Cpux";

        }

 


但是如果是其他.c文件(例如demo.c),则会放在默认的text段中,这个是由Link文件中下面语句决定的:


 

#    if LCF_DEFAULT_HOST == LCF_CPU0

    group (ordered, run_addr=mem:pfls0)

#    endif

    {

      select".text.*";

      select".text.fast.pfls.cpu0";

      select".text.slow.pfls.cpu0";

      select".text.5ms.pfls.cpu0";

      select".text.10ms.pfls.cpu0";

      select".text.callout.pfls.cpu0";

     }

 


Predefined rodata/rodata:


rodata段用来存放代码,它分为两种:一种是预先定义好的rodata段,另外一种默认的rodata段。


预先定义好的rodata段,例如.rodata.Cpu1_Main.*,在Cpu1_Main.c中的常量会放在这个段内。

 

 

group (ordered, align = 4, run_addr=mem:pflsx)

      {

        select".rodata.Ifx_Ssw_Tcx.*";

        select".rodata.Cpux_Main.*";

}

 


但是如果是其他.c文件(例如demo.c),则会放在默认的rodata段中,这个由Link文件中下面语句决定:


 

#    if LCF_DEFAULT_HOST == LCF_CPU0

    group (ordered, align = 4, run_addr=mem:pfls0)

#    endif

    {

      select".rodata.*";

      select".rodata.farConst.cpu0.32bit";

      select".rodata.farConst.cpu0.16bit";

      select".rodata.farConst.cpu0.8bit";

    }

   }

 


1.3 (d)LMU


LMU分为各个CPU私有的dLMU和共用的LMU两部分,在MCAL中的Link文件中只是定义了LMU的几个段,在工程中并没有用到这个区域,关于怎么把变量放到LMU中,请看第2.2和2.3章。


1.4 PSRAM


每个CPU都有自己的PSRAM区域,这个区域可以运行程序,也可以存放数据,在Link中只是定义了几个段,在工程中并没有用到这个区域,关于怎么在这个区域运行程序,请看第2.4章。


1.5 UCB


UCB是配置MCU参数的一块区域,关于怎么在程序中配置UCB区域,请看第2.7章


2 代码和变量定位


2.1 把变量放在DSRAM 


2.1.1 把变量放在固定位置


如果需要把变量放在固定位置,则需要在Link文件中,首先定义一个data段,从0x7001000开始,一个bss段,从0x70004000开始


 

/*Far Data / Far Const Sections, selectable with  patterns and user defined sections*/

  section_layout :vtc:linear

  {

    /*Far Data Sections, selectable with patterns and  user defined sections*/

    group

    {

       

     

        group (ordered, attributes=rw, run_addr=0x70001000)

        {

          select".bss.user_test_bss";

        }

       

        group (ordered, attributes=rw, run_addr=0x70004000)

        {

          select".data.user_test_data";

        }

}

}

 


在程序中定义如下,则run_cnt1和run_cnt2, 则run_cnt1就会放在0x70001000, run_cnt2放在0x70004000。


 

#pragma  section farbss "user_test_bss"

volatileuint32 run_cnt1;

#pragma  section farbss restore

 

#pragma  section fardata "user_test_data"

volatileuint32 run_cnt2 =  0x1234;

#pragma section fardata restore

 


编译后,查看map文件,可以发现定义的变量放在预期的位置。



2.1.2 把变量放在其它DSRAM


默认的全局变量都是放在DSRAM0中,如果需要使用其他DSRAM,则可以把变量放在Link文件已经定义好一些段中:


 

/* Initialized Data */

          select"*InitData.Cpux.8bit";

          select"*InitData.Cpux.16bit";

          select"*InitData.Cpux.32bit";

   

          /* UnInitialized Data */

          select"*ClearedData.Cpux.8bit";

          select"*ClearedData.Cpux.16bit";

          select"*ClearedData.Cpux.32bit";

 


例如,如果想把变量放在DSRAM1中,则在程序中可以这么写:


 

#pragma  section farbss "ClearedData.Cpu1.32bit"

volatileuint32 run_cnt1_dsram1;

#pragma  section farbss restore

 

#pragma  section fardata "InitData.Cpu1.32bit"

volatileuint32  run_cnt2_dsram1 = 0x1234;

#pragma section fardata restore

 


查看map,发现变量放在PSRAM1的预期:



2.2 把变量放在DLMU


在Link文件已经定义了各个CPU所属的DLMU的段,如下:


 

group (ordered, attributes=rw, run_addr = mem:cpux_dlmu)

        {

          select".data.*.lmudata_cpux";

          select".bss.*.lmubss_cpux";

        }      

 


如果想把变量放在DLMU2中,则可以如下面这样写:


 

#pragma  section farbss "test.lmubss_cpu2"

volatileuint32 run_cnt1_dlmu2;

#pragma  section farbss restore

 

#pragma  section fardata "test.lmudata_cpu2"

volatileuint32  run_cnt2_dlmu2 = 0x1234;

#pragma section fardata restore

 


查看map文件,发现这两个变量已经放在DLMU2中:



2.3 把变量放在LMU


在Link文件已经定义了LMU的段,如下:


 

group (ordered, attributes=rw, run_addr=mem:lmuram/cached)

        {

          select".data.*.lmu_data";

          select".bss.*.lmu_bss";

}

 

group (ordered, attributes=rw, run_addr = mem:lmuram/not_cached)

        {

          /* Initialized Data */

          select"*InitData.LmuNC.8bit";

          select"*InitData.LmuNC.16bit";

          select"*InitData.LmuNC.32bit";

     

          /* UnInitialized Data */

          select"*ClearedData.LmuNC.8bit";

          select"*ClearedData.LmuNC.16bit";

          select"*ClearedData.LmuNC.32bit";

   

        }

 


如果想把变量放在LMU(不用CACHE)中,则可以如下面这样写:


 

#pragma  section farbss "ClearedData.LmuNC.32bit"

volatileuint32 run_cnt1_lmu;

#pragma  section farbss restore

 

#pragma  section fardata "InitData.LmuNC.32bit"

volatileuint32 run_cnt2_lmu  = 0x1234;

#pragma section fardata restore

 


查看map文件,发现变量已经放在LMU区域:



2.4 把程序放在PSRAM中运行


有时候需要把程序放到RAM去运行,例如在擦写Flash的时候,这个时候可以直接把代码放在 “FLSLOADERRAMCODE” 段,也可以自己在PSRAM中再定义一个段,如下所示:


 

section_layout  :vtc:linear

    {

        group  MY_RAM_CODE (ordered, attributes=rwx, copy, run_addr=mem:psram0)

        {

           select".text.my_ram_code";

        }

    }

 


在程序中定义如下, 这样RunTest()这个函数就会在PSRAM0中去运行:


 

#pragma  section code "my_ram_code"

void RunTest(void)

{

    run_cnt1++;

    run_cnt2++;

    run_cnt1_dsram1++;

    run_cnt2_dsram1++;

    run_cnt1_dlmu2++;

    run_cnt2_dlmu2++;

    run_cnt1_lmu++;

    run_cnt2_lmu++;

}

#pragma section code restore

 


查看map文件,可以看到RunTest()放在PSRAM0中:



2.5 把程序放在PFLASH中指定位置


如果需要把程序放在指定位置执行,则可以在Link文件中首先定义一个程序段,例如把程序放在0x80041000开始的地址,则可以如下定义:


 

/* user define code section */

      group  user_test_code (ordered, run_addr=0x80041000)        

{

        select"(.text.user_test_code*)";

      }

 


在程序中定义如下,则AddTest()就会放在0x80041000地址:


 

#pragma  section code "user_test_code"

uint32 AddTest(uint32 a, uint32 b)

{

    uint32 c = a+b;

    return c;

}

#pragma section code restore

 


查看map文件,发现AddTest()已经放在预期位置。



2.6 把常量放在PFLASH中指定位置


如果需要把常量放在指定位置,则可以在Link文件中首先定义一个常量段,例如把常量放在0x80040000开始的地址,则可以如下定义:


 

/* user define const section */

group  user_test_const (ordered, run_addr=0x80040000) 

      {

        select".rodata.user_test_const" ;

      }

 


在程序中定义如下,则user_test_const就会放在0x80040000地址:


 

#pragma  section farrom "user_test_const"

volatileconstuint32 user_test_const[4]  = {0x12345678, 0x87654321, 0xAABBCCDD, 0xFFEEDDCC};

#pragma section farrom restore

 


查看map文件,发现user_test_const已经放在预期位置。



2.7 用数组设置UCB区域


操作UCB可以使用调试器,但是一般在工厂烧录时,需要把程序和UCB一起烧录进去,这个时候就需要把UCB的数据放在程序中。下面以使能HSM为例介绍在程序中设置UCB的流程。


首先需要在Link文件中定义需要操作UCB段,例如使能HSM,需要操作UCB_HSMCOTP0_ORIG。


 

/*Fixed memory Allocations for HSM Configuration*/

    group (ordered)

    {

        group  hsmxcotp0_orig (run_addr=mem:ucb[0x2800])

        {

           select".rodata.hsmcotp0_orig";

        }

    }

 


在程序定义如下,则把编译后hex中的UCB部分烧录进去,MCU的HSM功能就能激活(具体请到英飞凌官网查看芯片用户手册“AURIX™ TC3xx User Manual”)。


 

#pragma  section farrom "hsmcotp0_orig"

constIfx_HsmCotp_Config hsmcotp0_orig =

{

     0x00000000, /* sf_proconusr, offset: 0x000 */

     0x00000001, /* boot_sector, bit[7:0]: SEL0, bit[15:8]: SEL1,  bit[23:16]: SEL2, bit[31:24]: SEL3 */

     0x00000000, /* hsm_exclusive0, offset: 0x008 */

     0x00000000, /* hsm_exclusive1, offset: 0x00C */

    0x00000000, /* hsm_otp0, offset: 0x010*/

     0x00000000, /* hsm_otp1, offset: 0x014 */

     0x00000001, /* sp_proconhsmcfg, bit0: HSM boot enable, offset:  0x018 */

     {

           0x00000000,  /* 0x01C, Reserved */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x020: Reserved (0x020 - 0x02F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x030: Reserved (0x030 - 0x03F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x040: Reserved (0x040 - 0x04F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x050: Reserved (0x050 - 0x05F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x060: Reserved (0x060 - 0x06F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x070: Reserved (0x070 - 0x07F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x080: Reserved (0x080 - 0x08F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x090: Reserved (0x090 - 0x09F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x0A0: Reserved (0x0A0 - 0x0AF) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x0B0: Reserved (0x0B0 - 0x0BF) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x0C0: Reserved (0x0C0 - 0x0CF) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x0D0: Reserved (0x0D0 - 0x0DF) */

           0x00000000, 0x00000000, 0x00000000,  0x00000000, /**<  \brief 0x0E0: Reserved (0x0E0 - 0x0EF) */

           0x00000000, 0x00000000, 0x00000000, 0x00000000, /**< \brief 0x0F0: Reserved (0x0F0 - 0x0FF) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x100: Reserved (0x100 - 0x100) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x110: Reserved (0x110 - 0x01F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x120: Reserved (0x120 - 0x02F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x130: Reserved (0x130 - 0x03F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x140: Reserved (0x140 - 0x04F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x150: Reserved (0x150 - 0x05F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x160: Reserved (0x160 - 0x06F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x170: Reserved (0x170 - 0x07F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x180: Reserved (0x180 - 0x08F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x190: Reserved (0x190 - 0x09F) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x1A0: Reserved (0x1A0 - 0x0AF) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x1B0: Reserved (0x1B0 - 0x0BF) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x1C0: Reserved (0x1C0 - 0x0CF) */

           0x00000000,  0x00000000, 0x00000000, 0x00000000, /**<  \brief 0x1D0: Reserved (0x1D0 - 0x0DF) */

           0x00000000, 0x00000000,  0x00000000, 0x00000000, /**< \brief 0x1E0: Reserved (0x1E0 - 0x0EF) */

     },

     0x43211234,    /**<  \brief 0x1F0: .confirmation: 32-bit CODE, (always same)*/

     {

           0x00000000,  /* 0x004, Reserved */

           0x00000000,  /* 0x008, Reserved */

           0x00000000,  /* 0x00C, Reserved */

     }

};

 


查看map文件,发现HSM UCB区域部分已经有了数据:


需要确保Flash中已经下载了HSM代码,再激活HSM,否则芯片将被锁死,因此为了安全,附带的例程中这部分HSM的配置是被注释掉的。


推荐阅读

一文详解CAN总线错误帧|附下载

DoIP协议介绍,资料分享!

详解车载网络 OTA系统的开发|文末附下载

一文了解汽车嵌入式AUTOSAR架构|附下载

关于 ASPICE 的理解

详解汽车Bootloader设计

特斯拉Autopilot系统安全研究|附dbc下载

分享不易,恳请点个【再看】
汽车ECU开发 专注于汽车电子ECU软件开发,技术分享。
评论
  • 数字隔离芯片是现代电气工程师在进行电路设计时所必须考虑的一种电子元件,主要用于保护低压控制电路中敏感电子设备的稳定运行与操作人员的人身安全。其不仅能隔离两个或多个高低压回路之间的电气联系,还能防止漏电流、共模噪声与浪涌等干扰信号的传播,有效增强电路间信号传输的抗干扰能力,同时提升电子系统的电磁兼容性与通信稳定性。容耦隔离芯片的典型应用原理图值得一提的是,在电子电路中引入隔离措施会带来传输延迟、功耗增加、成本增加与尺寸增加等问题,而数字隔离芯片的目标就是尽可能消除这些不利影响,同时满足安全法规的要
    华普微HOPERF 2025-01-15 09:48 96浏览
  • 随着通信技术的迅速发展,现代通信设备需要更高效、可靠且紧凑的解决方案来应对日益复杂的系统。中国自主研发和制造的国产接口芯片,正逐渐成为通信设备(从5G基站到工业通信模块)中的重要基石。这些芯片凭借卓越性能、成本效益及灵活性,满足了现代通信基础设施的多样化需求。 1. 接口芯片在通信设备中的关键作用接口芯片作为数据交互的桥梁,是通信设备中不可或缺的核心组件。它们在设备内的各种子系统之间实现无缝数据传输,支持高速数据交换、协议转换和信号调节等功能。无论是5G基站中的数据处理,还是物联网网关
    克里雅半导体科技 2025-01-10 16:20 451浏览
  • 根据Global Info Research(环洋市场咨询)项目团队最新调研,预计2030年全球无人机电池和电源产值达到2834百万美元,2024-2030年期间年复合增长率CAGR为10.1%。 无人机电池是为无人机提供动力并使其飞行的关键。无人机使用的电池类型因无人机的大小和型号而异。一些常见的无人机电池类型包括锂聚合物(LiPo)电池、锂离子电池和镍氢(NiMH)电池。锂聚合物电池是最常用的无人机电池类型,因为其能量密度高、设计轻巧。这些电池以输出功率大、飞行时间长而著称。不过,它们需要
    GIRtina 2025-01-13 10:49 204浏览
  • PNT、GNSS、GPS均是卫星定位和导航相关领域中的常见缩写词,他们经常会被用到,且在很多情况下会被等同使用或替换使用。我们会把定位导航功能测试叫做PNT性能测试,也会叫做GNSS性能测试。我们会把定位导航终端叫做GNSS模块,也会叫做GPS模块。但是实际上他们之间是有一些重要的区别。伴随着技术发展与越发深入,我们有必要对这三个词汇做以清晰的区分。一、什么是GPS?GPS是Global Positioning System(全球定位系统)的缩写,它是美国建立的全球卫星定位导航系统,是GNSS概
    德思特测试测量 2025-01-13 15:42 512浏览
  •   在信号处理过程中,由于信号的时域截断会导致频谱扩展泄露现象。那么导致频谱泄露发生的根本原因是什么?又该采取什么样的改善方法。本文以ADC性能指标的测试场景为例,探讨了对ADC的输出结果进行非周期截断所带来的影响及问题总结。 两个点   为了更好的分析或处理信号,实际应用时需要从频域而非时域的角度观察原信号。但物理意义上只能直接获取信号的时域信息,为了得到信号的频域信息需要利用傅里叶变换这个工具计算出原信号的频谱函数。但对于计算机来说实现这种计算需要面对两个问题: 1.
    TIAN301 2025-01-14 14:15 118浏览
  • 01. 什么是过程能力分析?过程能力研究利用生产过程中初始一批产品的数据,预测制造过程是否能够稳定地生产符合规格的产品。可以把它想象成一种预测。通过历史数据的分析,推断未来是否可以依赖该工艺持续生产高质量产品。客户可能会要求将过程能力研究作为生产件批准程序 (PPAP) 的一部分。这是为了确保制造过程能够持续稳定地生产合格的产品。02. 基本概念在定义制造过程时,目标是确保生产的零件符合上下规格限 (USL 和 LSL)。过程能力衡量制造过程能多大程度上稳定地生产符合规格的产品。核心概念很简单:
    优思学院 2025-01-12 15:43 540浏览
  • 食物浪费已成为全球亟待解决的严峻挑战,并对环境和经济造成了重大影响。最新统计数据显示,全球高达三分之一的粮食在生产过程中损失或被无谓浪费,这不仅导致了资源消耗,还加剧了温室气体排放,并带来了巨大经济损失。全球领先的光学解决方案供应商艾迈斯欧司朗(SIX:AMS)近日宣布,艾迈斯欧司朗基于AS7341多光谱传感器开发的创新应用来解决食物浪费这一全球性难题。其多光谱传感解决方案为农业与食品行业带来深远变革,该技术通过精确判定最佳收获时机,提升质量控制水平,并在整个供应链中有效减少浪费。 在2024
    艾迈斯欧司朗 2025-01-14 18:45 72浏览
  • 随着数字化的不断推进,LED显示屏行业对4K、8K等超高清画质的需求日益提升。与此同时,Mini及Micro LED技术的日益成熟,推动了间距小于1.2 Pitch的Mini、Micro LED显示屏的快速发展。这类显示屏不仅画质卓越,而且尺寸适中,通常在110至1000英寸之间,非常适合应用于电影院、监控中心、大型会议、以及电影拍摄等多种室内场景。鉴于室内LED显示屏与用户距离较近,因此对于噪音控制、体积小型化、冗余备份能力及电气安全性的要求尤为严格。为满足这一市场需求,开关电源技术推出了专为
    晶台光耦 2025-01-13 10:42 516浏览
  • ARMv8-A是ARM公司为满足新需求而重新设计的一个架构,是近20年来ARM架构变动最大的一次。以下是对ARMv8-A的详细介绍: 1. 背景介绍    ARM公司最初并未涉足PC市场,其产品主要针对功耗敏感的移动设备。     随着技术的发展和市场需求的变化,ARM开始扩展到企业设备、服务器等领域,这要求其架构能够支持更大的内存和更复杂的计算任务。 2. 架构特点    ARMv8-A引入了Execution State(执行状
    丙丁先生 2025-01-12 10:30 480浏览
  • 新年伊始,又到了对去年做总结,对今年做展望的时刻 不知道你在2024年初立的Flag都实现了吗? 2025年对自己又有什么新的期待呢? 2024年注定是不平凡的一年, 一年里我测评了50余块开发板, 写出了很多科普文章, 从一个小小的工作室成长为科工公司。 展望2025年, 中国香河英茂科工, 会继续深耕于,具身机器人、飞行器、物联网等方面的研发, 我觉得,要向未来学习未来, 未来是什么? 是掌握在孩子们生活中的发现,和精历, 把最好的技术带给孩子,
    丙丁先生 2025-01-11 11:35 466浏览
  • 流量传感器是实现对燃气、废气、生活用水、污水、冷却液、石油等各种流体流量精准计量的关键手段。但随着工业自动化、数字化、智能化与低碳化进程的不断加速,采用传统机械式检测方式的流量传感器已不能满足当代流体计量行业对于测量精度、测量范围、使用寿命与维护成本等方面的精细需求。流量传感器的应用场景(部分)超声波流量传感器,是一种利用超声波技术测量流体流量的新型传感器,其主要通过发射超声波信号并接收反射回来的信号,根据超声波在流体中传播的时间、幅度或相位变化等参数,间接计算流体的流量,具有非侵入式测量、高精
    华普微HOPERF 2025-01-13 14:18 502浏览
  • 随着全球向绿色能源转型的加速,对高效、可靠和环保元件的需求从未如此强烈。在这种背景下,国产固态继电器(SSR)在实现太阳能逆变器、风力涡轮机和储能系统等关键技术方面发挥着关键作用。本文探讨了绿色能源系统背景下中国固态继电器行业的前景,并强调了2025年的前景。 1.对绿色能源解决方案日益增长的需求绿色能源系统依靠先进的电源管理技术来最大限度地提高效率并最大限度地减少损失。固态继电器以其耐用性、快速开关速度和抗机械磨损而闻名,正日益成为传统机电继电器的首选。可再生能源(尤其是太阳能和风能
    克里雅半导体科技 2025-01-10 16:18 333浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦