嵌入式小知识

echo -e 'AT+USBMD="mode1","1"\r\n' >/dev/ttyUSB0 ;cat /dev/ttyUSB0
echo "--------bao cun--------------" >/dev/console
echo -e 'AT+SETUSBINI="AfterPowerLoss","1"\r\n' >/dev/ttyUSB0;cat /dev/ttyUSB0

factory_hm info cus sc
factory_hm info rom 05
factory_hm info language 1

echo -e "AT+HSVER\r\n" >/dev/ttyUSB0;cat /dev/ttyUSB0

factory_hm info sn 20211109001b150-05PGR5

factory_hm mac lan 44:18:47:00:B1:50


echo -e 'AT+USBMD="mode1"\r\n' >/dev/ttyUSB1
sleep 3 && echo -e 'AT+USBMD="mode1","1"\r\n' >/dev/ttyUSB0
sleep 3 && echo -e 'AT+SETUSBINI="AfterPowerLoss","1"\r\n' >/dev/ttyUSB0


设置有线优先

1、总结文档和梳理学习的嵌入式知识,习惯的养成。浩哥的看书和代码敲打,然后自己项目的搭建,学会嵌入式的书籍,够用的策略。养成自己良好的学习习惯

总结:
嵌入式系统内层地址空间
嵌入式系统的内存地址空间布局,简单的说就是我们写好代码,在编译的过程中,把代码里的不同的变量、函数相应的保存在
每个断中(.text .data .bss),至于堆空间、栈空间是代码在芯片上运行时才存在的。
.text :代码段。包含了操作系统和应用程序的所有代码
.data    :数据段。存放了操作系统和应用程序当中所有的带初始值的全局变量
.bss    : bss段。存放了操作系统和应用程序当中所有未带初始化的全局变量
堆空间:动态分配的内存空间
栈空间:保存运行上下文以及函数调用时的局部变量和形参

1、什么样的数据会保存在.text段?.data段?.bss段?栈空间和堆空间

unsigned char gvCh;//全局变量,没有初值,放在.bss段中
unsigned int gvInt = 0x123;    //全局变量,有初值,放在.data段中

int main(void)//main函数在经过编译以后得到的机器代码,存在在,text代码中
{
    unsigned char arry[10],*p;//局部变量,存放在栈中
    p = malloc(10*sizeof(char));//p指针指向的空间,存放在堆中
    while(1);
}
补充:上面定义的全局变量没有在代码上引用,在实际应用中,他们会被编译器优化掉,那么他们根本就不会暂用内存空间

2、如果用上变量修饰词static、const又时如何存储的呢?

unsigned char gvCh_init[3] = {1,2,3}; //.data段,如果数组增大100字节,那么bin文件大小会也会随之增大
unsigned char gvCh_no_init[3];//.bss段,如果数组增大为100字节,那么bin文件大小不会发生变化,在bin文件里只是记录这个数组的起始地址和大小,当程序运行时自动把它的值清零。

问题4,unsigned chat gvCh[100] ={0};算不算给数组gvCh设置了初值而被保存在.data段,将占用bin文件大小?

答:在IAR编译器里,unsigned chat gvCh[100] ={0}等同于unsigned chat gvCh[100],保存于.bss段。


问题5,我们知道在芯片上有ROM存储器和RAM存储器,在程序bin文件烧录到芯片上时,不同的段会如何存在于在ROM和RAM里呢?

答:没有一一对应的关系。因为我可以把bin文件烧录到flash(ROM)里面运行,也可以把它烧录到RAM里面运行(调试时会这么做)。

通常地,我们会把编译好的程序烧录到flash(ROM)里面去,芯片掉电时不会消失;对于RAM存储器来说,只有芯片上电代码运行起来,才会被分配使用(栈/堆就是在RAM开辟的)

问题6,代码中的变量会以什么样的规则存在于ROM存储器和RAM存储器里?

答:主要根据变量在运行时是否可修改,下面举例说明:

unsigned char gvCh;可读写,存放在RAM(无初始值,.bss段)
unsigned int gvInt = 0x12345678;//可读写,存放在RAM(有初始值,.data段)
const unsigned long gvLong = 0x87654321; //只读,存放在ROM
 
int main1(void)//main函数在经过编译以后得到的机器代码,不可修改,存放ROM
{
    unsigned char arry[10],*p;//可读写,存放在栈当中,也就是在RAM中
   
    p = malloc(10*sizeof(char));//p指针变量指向的空间,存放在堆当中,也就是在RAM中
    while(1);
}

有初始值、并且可读写的全局变量gvInt存放在RAM,但我们知道在RAM的数据掉电会丢失,其实它的初始值0x12345678一开始保存在flash(ROM)里,在芯片上电时,会将初始值复制到RAM里的gvInt变量(它所在RAM的地址在编译后已经确定)。可能我们会疑惑,自己的代码明明没有写给gvInt变量赋值的过程,这一部分代码并不需要我们做。芯片上电就会进入Reset_Handler中断,打开.s启动文件,我们可以发现在Reset_Handler中断里,调用了SystemInit函数,然后再调用了_main(IAR编译器的话是__iar_program_start)函数,在_main函数会进行RW data的复制,和.bss段的初始化,以及C库函数的初始化(比如malloc函数需要初始化才能使用),进而调用main函数进入我们的代码区域。


linux内核目录:
  /include子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。
  /init子目录包含了内核的初始化代码,这里的代码是内核工作的起始入口。
  /arch子目录包含了所有处理器体系结构特定的内核代码。如:arm、i386、alpha。
  /drivers子目录包含了内核中所有的设备驱动程序,如块设备和SCSI设备。
  /fs子目录包含了所有的文件系统的代码,如:ext2,vfat等。
  /net子目录包含了内核的网络相关代码。
  /mm子目录包含了所有内存管理代码。
  /ipc子目录包含了进程间通信代码。
  /kernel子目录包含了内核核心代码

gCC的编译过程

静态库和动态库区别?
    函数库分为静态库和动态库两种,静态库是一系列的目标文件(.o文件)的归档文件(文件名格式为libname.a),如果在编译某个程序时链接静态库,则链接器将会搜索静态库,从中提取出它所需要的目标文件并直接拷贝到该程序的可执行二进制文件(ELF格式文件)之中;动态库(文件名格式为libname.so[.主版本号.次版本号.发行号])在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入。
    
问题1:嵌入式硬件设备一般由哪几大部分组成?
问题2:交换机或路由器设备启动流程?
问题3:什么是指令?什么是CPU周期?什么是时钟周期?
问题4:嵌入式系统内核体系结构一般由哪几部分组成?
问题5:嵌入式设备所能支持的内存大小主要由哪些因素决定?
问题6:程序内存空间由哪几部分组成?存放地址顺序是怎样?
问题7:GCC编译过程?
问题9:相同架构(ARMv9)不同厂商的CPU,为什么linux交差编译工具链和 内核代码不完全一样?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

潘多拉的面

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

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

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

打赏作者

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

抵扣说明:

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

余额充值