- 博客(30)
- 收藏
- 关注
原创 全局变量不入栈原理
常规情况:全局变量始终存储在静态数据区,无需入栈248。特殊情况:中断等场景可能临时将全局变量值保存到栈中,但变量本身仍位于静态存储区1。合理使用全局变量可避免内存浪费,但需注意多线程环境下的同步问题。
2025-03-20 11:11:49
230
原创 CrossCore Embedded Studio 中修改 LDF 文件
在此示例中,"myFirstLargeArray" 将被放置在 "MyData" 段,而 "mySecondLargeArray" 因编译指令作用域结束,将被放置在默认段(如 "data1")。推荐使用 C/C++ 源文件中的 "section" 和 "default_section" 编译指令,以及汇编文件中的 ".section" 关键字来实现。此外,对于 SDRAM 内存范围,可通过系统配置对话框中 LDF 部分的"启动代码/LDF"插件启用"自定义分区"选项,这将用。
2025-03-12 11:14:14
806
原创 ADSP21569 集成开发map映射功能整理
3、在app.ldf文件中打开#include "adi_ss_uc_app.ldf"文件,注意该文件应手动放置在工程中。4,adi_ss_uc_app.ld 对gmap.asm文件中定义的变量分配内存空间。1,在gmap.asm中定义内存分配需要的变量。2、在app.ldf链接文件中定义内存地址。
2025-03-10 15:07:59
121
原创 ADSP21569 SPORT使用静态配置驱动方法
2、驱动静态配置可以找到驱动对应驱动配置文件,比如adi_sport_config_2156x.h文件,需要将使用到的SPORT个数,SPORT编号打开,并设置相应寄存器即可,优点直观了解驱动配置,缺点为新同事不易找到配置文件。1,ADI的API比如SPORT驱动API 截图如下所示 可以查看帮助文档获取并使用,调用简洁方便,但不会直观与寄存器联系,不利于调试。ADSP Driver除了可以使用提供API配置,还可以使用静态配置文件进行配置。
2025-03-07 18:40:05
119
原创 RH850中断总结
其中EI级可屏蔽中断即是我们最常接触的中断,在RH850中最高可分为16个优先等级。每个EI级中断,以功能模块命名,如定时器TAUD0的通道2中断命名为INTTAUD0I2。RH850的中断从功能上分为三种,FE级不可屏蔽中断,FE级可屏蔽中断,以及EI级可屏蔽中断。EI级可屏蔽中断中断是我们定义的各个功能模块所产生的中断。:包括位错误,RAM错误,以及低压检查等中断,可设置PSW.NP=1来屏蔽该种类型中断。:即是我们定义的功能性中断如CAN接收中断,定时器中断等。EI():允许EI级中断。
2025-01-06 10:05:26
240
原创 善于使用IED help 手册 查找汇编指令功能
此时我们可以在编译环境的help中的找到搜索查找,比如我使用CCES IDE。在程序开发时有时候我们并不知道汇编指令的功能,如.var。所以使用编译器帮组文档,来查看汇编指令功能也是不错的选择。打开帮助文档搜索就能看到汇编指令的介绍。
2024-11-08 13:55:48
155
原创 DSP中电压、电流,功率增益DB理解、log计算基础整理,增益与放大倍数速查表
用分贝表示正好下降了3dB(根据电压幅度计算:20log(0.707)=-3dB ,根据功率计算:10log(0.5)=-3dB),对应的频率称为上截止频率,又常称为-3dB带宽。1.分贝就是放大器增益的单位 --- dB ,放大器输出与输入的比值为放大倍数,单位“倍”,如10倍放大器,100倍放大器。放大器级联时,总的放大倍数是各级相乘。1.电压(电流)放大倍数分贝数定义:K=20lg(Vo/Vi),其中K为放大倍数的分贝数,Vo为放大信号输出,Vi为信号输入;(1)增益为0dB时,信号直通,未经放大。
2024-10-14 14:52:41
708
原创 命令回显echo
而在Makefile中书写在同一行中的多个命令属于一个完整的shell命令行,书写在独立行的一条命令是一个独立的shell命令行。所以需要注意:在一个规则的命令中,命令行“cd”改变目录不会对其后的命令的执行产生影响。另外,如果使用make的命令行参数“-n”或“--just-print”,那么make执行时只显示所要执行的命令,但不会真正的去执行这些命令(可参考8.7 make的命令行选项一节)。此规则所定义的命令将会被执行,如果是多行命令,那么make就为每一行命令使用一个独立的子shell去执行。
2024-09-29 14:32:51
518
原创 Make File执行过程梳理、通配符*及wildcard、伪目标.PHONY
伪目标是这样一个目标:它不代表一个真正的文件名,在执行make时可以指定这个目标来执行其所在规则定义的命令,有时我们也可以将一个伪目标称为标签。使用伪目标有两点原因:1. 避免在我们的Makefile中定义的只执行命令的的目标(此目标的目的为了执行执行一些列命令,而不需要创建这个目标)和工作目录下的实际文件出现名字冲突。但在变量的定义和使用函数是,通配符不会被自动的展开。7. 执行除“终极目标”以外的所有的目标的规则(规则中如果依赖文件中任一个文件的时间戳比目标文件新,则使用规则所定义的命令重建目标文件)
2024-09-25 11:05:42
689
原创 GCC Compiler Process
Pre-processing: In this step, the GNU preprocessor (cpp.exe) creates an intermediate file having the source code. The preprocessor includes the headers (#include) and expands the macros (#define). Consider the below command:The above command will create an
2024-09-20 13:43:02
980
原创 vi editor 介绍及common keyboard shortcut
【代码】vi editor 介绍及common keyboard shortcut。
2024-09-20 11:15:45
758
原创 50 Linux Commands Linux常用命令
1. ls CommandPurpose: List files and directories from the CLIIt is similar to navigating in the File Explorer with a GUI.The ls – l displays detailed information about files and directories in the current directory. If you want to check files in another di
2024-09-20 10:43:17
974
原创 Renesas Flash Programmer 刷写正确Flash Opitons方法
5,在Operation Settings界面下只勾选Program Flash Options选项,再Option下Start,此时Option OPBT就更改过了,MCU可以正常启动了。现象:因为刷写不正确的Flash Options 界面的OPTn数据后MCU无法启动,观察到MCU电流维持在未启动状态。2,我们使用Read Flash Options读取另外一个MCU正确OPBT数据。4,将要设置的MCU,设置正确的选项,数据正确的OPBT数据。3,读出正常数据显示在Flash Options中。
2024-08-12 09:45:11
463
原创 如何统计MCUROM,RAM已使用大小
7,RAM亦可通过如上方法进行确认,(因RAM不会在PTP中体现,所以不用第五步确认),RAM分为静态RAM和动态RAM,动态RAM作为堆栈动态使用。6,从手册里可以看出该型号MCU的ROM共2M,剩余ROM = 0x1FFFFF - 0X1c7ffc-0x04 = 223K。1,首先我们需要查找MCU的芯片手册,已RH850芯片为例,手册里会标注内存空间划分及其启止地址。3,在Sections里面找到段的映射分配表,找到最后一个分配项。2,以ROM为例,找到ld连接文件,并找到MEMORY映射。
2024-08-02 10:12:30
871
原创 RH850 F1K系列芯片 从DeepStop到WakeUp 读取WUF寄存器异常分析
1,在使用RH850 F1K系列芯片开发新项目中需要在MCU进入DeepStop Mode后唤醒时读取唤醒源WUF0寄存器以区分CAN唤醒还是ACC唤醒。3、进行工程debug,将断点打在0地址,进入DeepMode后使用CAN唤醒,读取WUFC0寄存器数值0x200,可以看出寄存器数值非0,为CAN唤醒。2、但唤醒打印WUFC0寄存器数值为0,经与瑞萨FAE确认正常读取该寄存器可以识别唤醒源,证明方向一致,怀疑该寄存器在读取前被Clean。
2024-05-08 14:17:27
712
1
原创 Makefile缺失库文件.a规则导致源文件未参与编译报错问题分析
3,打开hsm_engine.c中相关的makefile文件,可以看出正常编译是应该输出 hsm_engine.o文件,故意改错修改hsm_engine.c 内容,查找OUT文件夹下的目标文件 hsm_engine.o,并未找到,由以上两点可以断定hsm_engine.c并未参与编译,而且可以看出如果该文件参与编译,那么会输出satechar的库文件。
2024-04-28 14:42:30
637
原创 Makfile中 = 、:= 、+=、?=的区别
用"="对变量进行赋值时,解析该变量的时候,该变量的值等于最后一次赋值时的值,而不是当前位置时该变量的值。“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。也就是说,变量的值将会是整个makefile中最后被指定的值。用":=“来赋值的,则是就地直接解析,只用往前看即可,和我们在C语言里的”="逻辑上是一样的。在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。在上例中,y的值将会是 xyz bar ,而不是 foo bar。
2024-04-28 12:57:34
396
原创 (二)DaVinci Developer AutoSAR工具 SWC Component 中Port口配置方法
4 ,下面把pot连接如runnable,连接后port才能让runnable使用,首先选择Runnable Entity List ->选择Runnable Entity -> Access points->New ->invoke operation。13,在component 的 runnable中可以看到port口的连接,到这里添加Port的功能的整个配置过程就完成了,希望对大家有帮助。12,在代码中runnable可以看到有port读取操作代码,10,查看自动连接是否是需要的连接,Finish。
2024-04-07 11:15:44
1826
原创 (一)DaVinci Developer AutoSAR工具 如何新建SWC、Component、RTE工程,超级详细步骤,赚到
1,创建SWC,第一步需要创建一个App组件类型,首先点击Object Brower菜单,然后左键Application Component Types 选项,然后右键New Application Component Type,组件类型的作用是来后续实例一个Compoent2、 Properties 选项卡中Nane中输入Type的名字,注意根据规范命名规则已CtAp开头,其他默认就好
2024-03-28 15:39:01
2347
2
原创 AUTOSAR OS 中新建Task方法
OS概念网络上资料比较多,这里不在重诉,下面我们使用 davinci 新建一个task,体验一下配置过程。1,首先我们 OS Application 位置,点击 + 号进行新建任务。3 将 任务的触发于task进行映射。2 双击 task 进行属性设置。4,check 编译就可以咯。
2024-03-21 16:44:38
978
1
原创 RH850 setup RAM初始化过程分析
大家都知道,我们的变量,这里说的变量是指初始化或未初始化的全局变量,静态全局变量,初始化或未初始化的静态局部变量,这些变量的地址已经在编译器程序连接后固定,且在map表里可以查看到,分配于date段和未初始化的分配于bss段中,但这些变量的值在编译后以二进制文件存于ROM中,并在MCU setup时由ROM搬运到RAM中,那么变量是怎么由ROM搬到RAM的map地址处呢?2,ram清除完成后进入_start处开始执行,接下来执行至ghs_ind_crt0处。map中ram段开始地址如下。
2024-03-08 16:31:57
964
1
原创 MCU汇编指令总结
jr和jal与程序调用函数有关。程序调用函数,当函数调用结束后需要重新继续执行原来的程序,所以在调用函数之前,必须先存储函数返回起始点地址。:比较目的操作数减去源操作数的隐含减法操作,不修改任何操作数。是寄存器中的数相加,
2024-03-05 15:37:14
464
原创 RH850 Setup.850 启动过程分析
中断变量重映射完成即进入main中,其实中间还有一些函数的调用,但不是重要流程,这里不一一列出了,从上我们可以看出其实启动过程主要完成就是CPU寄存器初始化,中断向量表重映射、和外链函数调用,希望对大家有所帮助。我们需要将中断处理函数的地址写入中断向量表偏移量相应位置中,这样发生相关中断才能找到中断服务入口,执行中断服务程序,下面是相关代码我们一起分析一下。下面我们来验证一下,下面是INTDMA0的map地址,和DEBUG中memery中段向量表的地址一致。的伪指令,表示“当前地址存放的内容为XX”。
2024-03-05 11:17:34
2427
2
原创 嵌入式MCU在进行嵌套函数调用或中断函数回调做了那些事
在进入嵌入函数前,将当前程序的PC指针压入LP指针中,然后开辟一块statck ,将SP指向该statck,将CPU寄存器中需要保存的数据压入栈中,更新PC指针执行内嵌函数,执行完内嵌函数,返回时将stack中保存的寄存器数据返回复制给CPU寄存器,更新母函数的SP, 将LD ->SP,返回上级函数处执行。这两天整理了相关知识,捋顺贯通了嵌套函数调用或中断函数回调做的事情,如下记录。
2024-03-01 16:51:08
231
1
原创 嵌入式系统中 CPU Reginsters 中 SP指针、Stack堆栈工程解析
因为程序在进行内嵌函数调用时,或回调中断HOOK时,需要保存CPU寄存器数据,比如LP,Rn等等寄存器数据,否则函数执行完后,返回到上级函数时,此时没有保存上级函数现场数据那么程序就会G掉或跑飞,方法就是进入内嵌函数前开辟一块内存堆栈空间,把所需保存的寄存器数据推入栈中,此时堆栈指针SP指向栈顶,内嵌函数执行完成返回上级函数时,再把寄存器数据从栈中弹出,PC指针指向上级函数的堆栈地址。
2024-03-01 15:53:41
591
1
原创 嵌入式系统中LP(Link pointer) SP(Stack point) PC(Program Counter)
LP:Used When the compiler call a function,当编译器调用函数时使用,其主要作用为当函数A内调用另一个函数B,PC在函数A的执行位置的指令地址存于LP中,然后程序执行进入函数B ,函数B执行之后将要返回函数A执行时,将LP指针中存放的指令地址返回给PC,PC在函数A中继续向下执行。下图在进入函数B后,LP中存放函数A PC+4,也就是B执行后会返回到A的下一个指令地址,另B的指令地址如下,可以看出此时PC指针指向了函数B的指令地址。下图可以看到当前PC在函数A中。
2024-03-01 10:52:57
828
1
原创 .bss段、.data段、与栈(statck)
局部变量存在堆栈中,临时生成,所以map中没有固定的内存地址,全局变量或静态局部变量存在BSS或Data段中,故有固定内存地址,以此记录。Data段:存放程序中已经初始化的全局变量及已经初始化的静态局部变量的一块区域。--定义为全局变量或静态局部变量在map表里能够搜到,局部变量在map中无法搜到,现象一:未初始化的全局变量,map中分配地址空间,在bss段中。现象二: 初始化的全局变量,map中分配地址空间,在data段中。现象三:局部变量在map中没有分配地址空间。
2024-02-29 18:17:34
347
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人