吕工系统培训C

来源:互联网 发布:小猪cms三网合一源码 编辑:程序博客网 时间:2024/04/30 02:48

无私分享的人真的很伟大!!!向吕工致敬~


20160830 周二

1、单片机和ARM程序存储和运行的地方

看了STC15系列 单片机 单独的flash程序存储器,单独的SRAM,还会配EEPROM。上电时,从flash里把全局变量搬到RAM里,分配好堆盏等空间,然后再取指令,一条一条的执行。

RAM:在任何时候都可以快速随机读写的功能,一般当做内存,即程序运行的地方,断电会丢失数据,也称临时存储介质。

ROM: 以前老的都上用ROM老存储数据,断电不丢失,资料一旦写入只能用特殊方法更改。比如紫外啊,一次性写入,I2C慢速存取啊之类的,但是在程序运行的过程中,保存数据不方便。这种不易更改的特性让更新资料相当麻烦。所以一些重要的参数什么的存在里面。

闪存 分nor flash nand flash,断电不丢失,快速存取,电子可擦除,代替了ROM在嵌入式系统的地位。

norflash 跟sram很想,可以随机快速存取,可以运行代码,但是价格高。一般装启动代码。

nandflash 不能随机存取,只能按块读取,一次就读取多少字节的,比较廉价,不能直接运行代码。

现在还出来一种FRAM铁电存储,它把随机存储和快速存储,断电不丢失结合起来。比闪存即flash跟快。但是它的密集度目前做不到sram dram flash这样,小容量使用还可以。

所以现在程序运行一般在sram里,用于运行是数据存储器,应用程序放在flash里,重要数据参数存在EEPROM里(价格低)。


2、 对于单片机代码运行不拷贝 MCU拷贝问题 

单片机 没有启动代码.s之类的文件。是因为C语言编译器在编译的时候直接把main入口指到了0地址。可以直接运行。

而MCU是有启动代码的。因为太复杂了,进入main前要配置很多。再进入main。启动代码是从0地址开始执行的。而nand flash因为不能直接运行程序,所以启动代码里需要

请教了师傅:

。。。

单片机 应用程序放在FLASH程序存储器里, 运行在SRAM里,因为简单,没有启东代码,C语言编译的时候就把MAIN函数的跳入对应到单片机程序运行地址0上了。   S3C2440如果不用nor的话 应用程序放在FLASH程序存储器里, 运行在SRAM里。,启东代码里有拷贝到SRAM的动作,   STM32F407 也是应用程序放在FLASH程序存储器里, 运行在SRAM里,启东代码就没有拷贝的说法。  他们都是flash 到 sram 怎么有的拷贝,有的不用拷贝呢?

:
单片机、STM32是RAM很小的,把程序拷贝过去是存储空间不够的,S3C2440是大RAM,把程序拷贝过去是够的,虽然这样既浪费空间又浪费时间,但是能通用,有一个引导程序,不管是从NORFLASH还是NANDFLASH启动,都行。
S3C2440的引导程序会自动判断,如果是NORFLASH启动,就只拷贝数据段,不拷贝程序段了

NORFLASH启动,只拷贝数据段不拷贝程序段?    那它运行的时候 指令去NANDflash里去一条一条的取么?那不是很慢?

是的,但是有CACHE

。。。。

模模糊糊的了解了点。

当从NAND启动时  cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。cpu是从0x00000000开始执行,也就是NAND flash里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行  当从非NAND flash启动时  nor flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000).然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。

这段代码没有看懂


3、内存空间分配


因为一旦进入堆栈,变量占用内存就会不像数据段那样这么固定和一目了然,而且如果内存小的话,更危险。所以当有大数据的时候,就直接定义成全局变量,而且不能大数据作为函数参数进行传递,使用指针。 malloc就是使用了堆栈,所以少用,用到就直接全局给分配空间。 本公司规定是超过100个字节,就全局变量。



20160825  

使用的软件 codeblocks

new --- project --- console application --- c 

主要有这几个问题,捋清除:


1、printf %d 能输出几位 



2、float 有效位数 是几位

float f32 = 1235895786.256152356;
printf("%f \r\n", f32);

运行后输出是: 1235895808.000000

因为float有效位数是7位。

float内存中的保存方式:

http://blog.csdn.net/yezhubenyue/article/details/7436624  非常形象详细的介绍了 float的存储方式。 但是很想知道知道这个有什么用呢?


双精度


假设有一个数 ***.***

有效位从左开始数7个,在内存里就是小数点后7位。  

所以如果整数部分就已经超过7位的话,读出来时 小数就都是0了,而且整数第8位就可能不是初始化时候的值了。

相当于精度已经不对了。


3、内存对齐

经常会看到编译器 会给内存分配地址的时候,存放的首地址是变量字节数的倍数,或者是偶数地址之类的。所以内存里会有空的地方。 这里存的方式理解了。为什么这么存,在网上找到一个很好的解释网址:  http://www.cnblogs.com/yanenquan/p/3566678.html   


对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为32位系统)如果存放在偶地址开始的地方,那么一个读周期就可以读出这32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit数据。显然在读取效率上下降很多。


4、什么叫编译 什么叫链接 

我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件、操作系统的启动代码和用到的库文件进行组织形成最终生成可执行代码的过程。

http://soft.chinabyte.com/database/174/12454174.shtml   这里又一个超级经典的解释。 图形画的很形象


5、大小端存储数据

0x12345678 

地址偏移

大端模式

小端模式

0x00

12(OP0)

78(OP3)

0x01

34(OP1)

56(OP2)

0x02

56(OP2)

34(OP1)

0x03

78(OP3)

12(OP0)


小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。

大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。


6、int uint8_t UINT8 u8 U8 

C语言里,int 是基本的数据类型标识方法。现在STM linux等都会给typedef 一下,这是C语言的扩展。其实是为了方便敲打和理解。


7、编译工具 设置 

如果选芯片进行编译,需要设置程序运行地址 IROM1

程序编译优化等级 最好选无优化。否则有时候编译器给你优化的跟你原来写的不一样。

+ -比<< >>优先级刚好高一级。。



0 0
原创粉丝点击