Flash字节对齐

        项目中读取内存信息的时候分为RAM和FLASH,在读RAM时直接读取地址上的值,而读FLASH的时候先进行4字节对齐,然后再读数据,对此有些疑惑,故进行一些探究。

        RAM允许字节级别的访问,可以灵活读取任意长度的数据。

        FLASH为了提高访问速度,保持数据的原子性,要求至少4字节对齐。

       4字节对齐代码如下所示:

addr=addr&(~0x3)

        通过和~3位与操作,3是0000...000011,~3就是1111...111100,位与操作舍弃掉后两位,使addr成为4的倍数,完成4字节对齐操作。

        
补充:

RAM (Random Access Memory)

RAM是一种易失性存储,意味着当电源关闭时,存储在其中的数据会丢失。RAM访问速度快,使其成为执行中程序和当前处理数据的理想存储位置。RAM中通常存储:

  • 操作系统的一部分:操作系统加载到RAM中以提供更快的执行速度。
  • 正在运行的程序:程序代码在执行前通常被加载到RAM中。
  • 临时数据:程序运行时产生的临时数据,如变量、数组和缓冲区内容。
  • 系统缓存:为了加速数据访问,系统可能将频繁访问的数据缓存在RAM中。

Flash存储器

Flash是一种非易失性存储,数据即使在断电后也能保持。由于其持久性和较大的存储容量,Flash存储器用于保存需要长期保留的数据。Flash中通常存储:

  • 启动加载程序(Bootloader):控制设备启动过程的小程序,负责初始化硬件并加载操作系统。
  • 操作系统映像:完整的操作系统或固件,用于设备的运行。
  • 应用程序:设备上的应用程序或软件,可能包括用户安装的软件。
  • 配置文件和用户数据:设备的配置设置、用户偏好设置以及用户生成的数据。
  • 持久化数据:需要在设备重启之间保留的数据,如日志文件、数据库和重要的状态信息。
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
.版本 2 .程序集 Flash播放类, , 公开 .子程序 窗口_菜单, 逻辑型, 公开 .参数 操作, 整数型, , 1.使菜单正常显示;2.只显示“关于”菜单;3.屏蔽菜单 .子程序 窗口_创建, 整数型, 公开, 创建一个Flash播放窗口,成功返回窗口句柄,失败返回0。 .参数 父窗口句柄, 整数型 .参数 左边, 整数型 .参数 顶边, 整数型 .参数 宽度, 整数型 .参数 高度, 整数型 .参数 右键菜单, 整数型, 可空, 1.正常显示;2.只显示“关于”菜单;3.屏蔽菜单,留空默认为1。 .参数 窗口风格, 整数型, 可空, 数值自己查,留空默认为无边框 .参数 扩展风格, 整数型, 可空, 数值自己查,留空为默认 .子程序 窗口_顶边, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的顶边。 .参数 新顶边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 窗口_高度, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的高度。 .参数 新高度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 窗口_挂接事件, 逻辑型, 公开, 挂接事件,不想设置的参数就留空,成功返回真,失败返回假。 .参数 鼠标位置被移动, 子程序指针, 可空, 必须有三个参数,分别为:横向位置、纵向位置、按键信息(即wParam的值,含义上网查);●注意:应该返回一个逻辑值,如果返回真,则将此事件继续传递到窗口上去,如果返回假或无返回值,则取消本事件,不再将此事件传递到窗口上去。 .参数 鼠标左键被按下, 子程序指针, 可空, 说明同上 .参数 鼠标左键被放开, 子程序指针, 可空, 说明同上 .参数 鼠标左键被双击, 子程序指针, 可空, 说明同上 .参数 鼠标右键被按下, 子程序指针, 可空, 说明同上 .参数 鼠标右键被放开, 子程序指针, 可空, 说明同上 .参数 按下某键, 子程序指针, 可空, 必须有两个参数,分别为:键代码、按键信息(即lParam的值,含义上网查);●注意:应该返回一个逻辑值,如果返回真,则将此事件继续传递到窗口上去,如果返回假或无返回值,则取消本事件,不再将此事件传递到窗口上去。 .参数 放开某键, 子程序指针, 可空, 说明同上 .子程序 窗口_禁止, 逻辑型, 公开, 设定或判断Flash窗口是否被禁止,真被禁止,假为未被禁止。 .参数 是否禁止, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 窗口_可视, 逻辑型, 公开, 设定或判断Flash窗口是否可视。真为可视,假为不可视。 .参数 是否可视, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 窗口_宽度, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的宽度。 .参数 新宽度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 窗口_取句柄, 整数型, 公开, 取得Flash窗口的句柄。 .子程序 窗口_是否已创建, 逻辑型, 公开, 已创建返回真,反之假。 .子程序 窗口_销毁, , 公开, 销毁已经创建的Flash窗口。 .子程序 窗口_左边, 整数型, 公开, 设定或取得Flash窗口相对于父窗口的左边。 .参数 新左边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_顶边, 整数型, 公开, 设定或取得动画图像相对于Flash窗口的顶边。 .参数 新顶边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_高度, 整数型, 公开, 设定或取得动画图像的高度。 .参数 新高度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_禁止, 逻辑型, 公开, 设定或判断动画图像所在窗口是否被禁止,真被禁止,假为未被禁止。 .参数 是否禁止, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 动画框_可视, 逻辑型, 公开, 设定或判断动画图像所在窗口是否可视。真为可视,假为不可视。 .参数 是否可视, 逻辑型, 可空, 不留空为设定,留空为取。 .子程序 动画框_宽度, 整数型, 公开, 设定或取得动画图像的宽度。 .参数 新宽度, 整数型, 可空, 不留空为设定,留空为取。 .子程序 动画框_取句柄, 整数型, 公开, 取得动画所在窗口的句柄。 .子程序 动画框_左边, 整数型, 公开, 设定或取得动画图像相对于Flash窗口的的左边。 .参数 新左边, 整数型, 可空, 不留空为设定,留空为取。 .子程序 控制_播放, , 公开 .子程序 控制_返回, , 公开, 返回到开头处 .子程序 控制_放大, , 公开, 放大图像 .参数 倍数, 双精度小数型, , 指定相对于当前图像尺寸的放大倍数,大于1为放大,等于1为不改变当前尺寸,小于1为缩小(若此时为原尺寸则无效),等于0为原尺寸。 .子程序 控制_后退, , 公开, 后退一帧并停止播放 .子程序 控制_挪动图像, 逻辑型, 公开, 将一个放大过的动画平移到指定的位置。 .参数 x, 整数型, , 单位为像素 .参数 y, 整数型 .子程序 控制_前进, , 公开 .子程序 控制_清除已载入文件, , 公开, 清除已载入的Flash文件。 .子程序 控制_取当前播放帧数, 整数型, 公开, 帧数从0算起,0表示动画的第一帧 .子程序 控制_取当前状态, 整数型, 公开, 0.正在载入;1.未初始化;2.已载入;3.正在交互;4.完成 .子程序 控制_取控制对象, 对象, 公开, Flash对象里面还有许多功能,我只封装了最常用的,得到对象后用 对象.查看() 自己研究其他功能如何使用。对象的属性、方法说明见:http://s8.hk/3tyq .子程序 控制_取已载入百分比, 整数型, 公开, 返回Flash播放器已经装载动画的百分比,0-100。 .子程序 控制_是否可跳转, 逻辑型, 公开, 检测可否跳转到某帧。 .参数 要跳到的帧, 整数型, , 帧数从0算起,0表示动画的第一帧 .子程序 控制_是否正在播放, 逻辑型, 公开 .子程序 控制_跳到某帧, , 公开 .参数 要跳到的帧, 整数型, , 帧数从0算起,0表示动画的第一帧 .子程序 控制_暂停, , 公开 .子程序 消息_发送, 整数型, 公开, 用SendMessage给Flash窗口发送消息 .参数 消息号, 整数型 .参数 参数1, 整数型 .参数 参数2, 整数型 .子程序 消息_投递, 逻辑型, 公开, 用PostMessage给Flash窗口投递消息 .参数 消息号, 整数型 .参数 参数1, 整数型 .参数 参数2, 整数型 .子程序 载入_Flash文件, 逻辑型, 公开 .参数 文件路径或URL, 文本型, , 可播放磁盘文件或网络上的文件 .参数 不循环播放, 逻辑型, 可空, 默认为假,即不断循环播放,为真则只播放一次 .参数 不立即播放, 逻辑型, 可空, 默认为假,即一载入就开始播放 .子程序 载入_内存中的Flash, 逻辑型, 公开, 载入内存或资源里的swf文件直接播放 .参数 Flash文件, 字节集, , Flash文件数据 .参数 不循环播放, 逻辑型, 可空, 默认为假,即不断循环播放,为真则只播放一次 .参数 不立即播放, 逻辑型, 可空, 默认为假,即一载入就开始播放 .子程序 属性_背景颜色, 整数型, 公开, 取得或设定Flash窗口的背景颜色,失败返回-1。 .参数 新RGB颜色值, 整数型, 可空, 不留空为设定,留空为取。 .子程序 属性_窗口模式, 整数型, 公开, 取得或设定Flash窗口的窗口模式,失败返回-1。 .参数 新窗口模式, 整数型, 可空, 不留空为设定,留空为取。1.默认模式;2.窗口不可透明;3.窗口可透明(如果动画中有透明的片段,放到这里时,就可以看到控件下面的背景)。 .子程序 属性_对齐方式, 整数型, 公开, 取得或设定动画图像的对齐模式,失败返回-1,已载入Flash后本属性才有效。 .参数 新对齐方式, 整数型, 可空, 不留空为设定,留空为取。1.左对齐;2.右对齐;4.顶对齐;8.底对齐,可以各项相加进行组合,比如同时左对齐和顶对齐为5。 .子程序 属性_可否全屏, 逻辑型, 公开, 取得或设定Flash是否允许全屏播放(只有Flash内部也设置有这个选项时本属性才有效)。 .参数 新值, 逻辑型, 可空, 不留空为设定,留空为取。真表示允许全屏,假表示不允许。 .子程序 属性_品质, 整数型, 公开, 设定或取得Flash的播放品质,1.高;2.中等;3.低,失败返回-1。 .参数 新品质, 整数型, 可空, 不留空为设定,留空为取。 .子程序 属性_取当前文件, 文本型, 公开, 取当前已载入的文件路径。 .子程序 属性_取总帧数, 整数型, 公开, 取已载入Flash的总帧数。 .子程序 属性_缩放模式, 整数型, 公开, 取得或设定Flash动画的缩放模式,失败返回-1。0.显示全部;1.沿长边拉伸;2.拉伸。 .参数 新缩放模式, 整数型, 可空, 不留空为设定,留空为取。 .子程序 属性_循环, 逻辑型, 公开, 取得或设定Flash是否循环播放。 .参数 是否循环, 逻辑型, 可空, 留空则为取,真为循环,假为不循环。
### 回答1: STM32L4系列微控制器的Flash写入对齐是指在进行数据写入操作时,需按照特定的对齐规则进行操作。这是由于Flash的写入操作必须按照特定的字节顺序进行,否则可能会导致数据写入错误。 STM32L4系列微控制器的Flash写入对齐要求以字为单位进行,即每次写入的数据长度必须是4字节(32位)的整数倍。如果写入的数据长度不满足该要求,就需要进行数据对齐处理,通常是通过在数据前面添加填充字节来使其长度满足要求。 例如,如果要写入长度为5字节的数据到Flash中,就需要进行对齐处理。在此情况下,可以添加3个填充字节,使总长度变为8字节,然后再进行写入操作。这样就满足了Flash写入对齐的要求。 对Flash进行写入对齐操作的目的是确保数据写入的可靠性和正确性。如果不按照要求进行对齐,可能会导致数据写入错位或错误,进而影响系统的稳定性和功能。 总之,STM32L4系列微控制器的Flash写入对齐要求数据长度必须是4字节的整数倍,如果不满足要求,则需要进行数据对齐处理。这样可以保证数据的正确写入,提高系统的可靠性。 ### 回答2: 在进行STM32 L4系列芯片的Flash写入操作时,对齐是非常重要的一个因素。对齐是指在数据写入Flash存储器时,需要按照特定的规则将数据的存储地址与Flash内存的块边界对齐对齐的目的是提高数据访问效率和保证写入数据的正确性。 在STM32 L4系列芯片中,Flash内存是以块的形式进行管理的,每个块的大小为一个固定的字节数。当进行Flash写入操作时,需要保证待写入数据的存储地址是块大小的倍数,即对齐于块边界。 对齐的好处主要有两点。首先,对齐可以提高数据访问的速度,因为Flash存储器是按块进行操作的,如果数据不对齐,可能会导致读取或写入操作跨越多个块,增加了访问时间。而对齐可以保证数据操作的范围在一个块内,减少了对其他块的访问,提高了效率。 其次,对齐可以确保写入数据的正确性。Flash存储器在进行写入操作时,只能对整个块进行擦除和写入,而不能对部分数据进行操作。如果数据不对齐,可能会导致需要修改的数据与其他数据混杂在同一个块中,从而导致擦除整个块,进而丢失其他数据。而对齐可以保证每个块只包含待写入的数据,避免了数据的损失。 总之,STM32 L4系列芯片的Flash写入对齐非常重要。正确的对齐可以提高数据访问效率和确保数据的正确性。在进行Flash写入操作时,需要根据Flash内存块的大小,保证待写入数据的存储地址是块大小的倍数,以充分利用Flash存储器的性能和功能。 ### 回答3: 在进行STM32 L4系列微控制器的Flash写入时,对齐是一个很重要的概念。 对齐意味着将数据按照特定的边界地址进行整理和存储。在STM32 L4系列中,Flash写入的最小单位是字(Word),每个字大小为4字节(32位)。因此,对齐的概念是基于字节的,要求每次写入的数据长度是4的倍数。 对齐是必要的,因为Flash的写入操作必须按照特定的规则进行。如果数据的长度不是4的倍数,并且没有对齐到起始地址,则会导致无效的写入操作,从而导致数据错误或者系统不稳定。 在进行Flash写入操作时,需要确保待写入数据的长度是4的倍数,并且起始地址是对齐的。一个简单的方法是使用字节对齐的数据类型或者使用填充字节(padding bytes)将数据补齐到4的倍数,并确保起始地址是对齐的。 另外,ST提供了一些库函数来帮助进行Flash写入操作的对齐。例如,通过调用HAL_FLASH_Program函数,可以以字节为单位进行连续写入,该函数会自动进行对齐。 总之,对齐是STM32 L4系列Flash写入的一个重要概念,确保数据长度是4的倍数,并且起始地址是对齐的是必要的,以避免写入操作错误和系统不稳定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

文子大人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值