OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5805|回复: 12

ucos中汇编语言问题

[复制链接]

23

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-9-5
在线时间
8 小时
发表于 2013-11-18 11:17:52 | 显示全部楼层 |阅读模式
PRESERVE8 
AREA    |.text|, CODE, READONLY
        THUMB 

这段汇编语言中|.text|啥意思没有搞懂啊  为什么要定义上边一段汇编语言 求大神指点一条明路  让小的得以超生

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-11-18 14:41:17 | 显示全部楼层
帮顶,我也不懂.求高手.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

22

主题

2254

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4486
金钱
4486
注册时间
2013-4-22
在线时间
337 小时
发表于 2013-11-18 14:50:03 | 显示全部楼层
PRESERVE8,是8字节对齐的一个指令,主要看编译器,keil的就是要8字节对齐,没有这条是编译不不通过的;AREA    |.text|, CODE, READONLY好像就是定义一个数据段,这些都是在分散加载文件的指令。你可以看看分散加载文件
回复 支持 反对

使用道具 举报

23

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-9-5
在线时间
8 小时
 楼主| 发表于 2013-11-18 15:10:14 | 显示全部楼层
回复【3楼】三叶草:
---------------------------------
什么是分散加载文件啊??
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-11-18 17:08:28 | 显示全部楼层
我也不懂,帮顶
不过这两条都是伪指令(即不是机器执行的汇编指令,给编译或连接器使用),看不懂,理解内容无碍。AREA  |.text|, CODE, READONL似乎说字串区与code区都是只读的,后面THUMB也是指示编译成THUMB指令
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-11-18 17:14:02 | 显示全部楼层
我还特别不明白类似OS_EVENT这样定义的,为什么不把OSEventType与OSEventCnt放在相邻位置,OSEventPtr卡在在中间这样多浪费空间呐

typedef struct os_event {
    INT8U    OSEventType;                    /* Type of event control block (see OS_EVENT_TYPE_xxxx)    */
    void    *OSEventPtr;                     /* ointer to message or queue structure                   */
    INT16U   OSEventCnt;                     /* Semaphore Count (not used if other EVENT type)          */
    OS_PRIO  OSEventGrp;                     /* Group corresponding to tasks waiting for event to occur */
    OS_PRIO  OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur                */

#if OS_EVENT_NAME_EN > 0u
    INT8U   *OSEventName;
#endif
} OS_EVENT;
回复 支持 反对

使用道具 举报

11

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
290
金钱
290
注册时间
2013-9-2
在线时间
9 小时
发表于 2013-11-18 17:59:28 | 显示全部楼层
回复【楼主位】喜欢晴天:
---------------------------------
|.text|  用于表示由 C 编译程序产生的代码段,或用于以某种方式与 C 库关联的代码段。
AREA    |.text|, CODE, READONLY   ;定义C编译器源代码的代码段,只读
众人划桨开大船!!!
回复 支持 反对

使用道具 举报

23

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-9-5
在线时间
8 小时
 楼主| 发表于 2013-11-18 20:07:59 | 显示全部楼层
回复【6楼】lanny_cn:
---------------------------------
首先感谢你的回答,我看你那段程序应该说的是事件控制列表吧,在结构体中我觉得两个位置在前后没什么影响吧?
回复 支持 反对

使用道具 举报

23

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-9-5
在线时间
8 小时
 楼主| 发表于 2013-11-18 20:20:05 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
大牛也不会了,略感欣慰,嘿嘿
回复 支持 反对

使用道具 举报

23

主题

106

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
242
金钱
242
注册时间
2013-9-5
在线时间
8 小时
 楼主| 发表于 2013-11-18 20:21:08 | 显示全部楼层
回复【7楼】I6believe:
---------------------------------
纸面意思理解了,深层含义搞不懂。谢谢大牛
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-11-18 21:24:08 | 显示全部楼层
回复【8楼】喜欢晴天:
---------------------------------
与对齐方式有关,这种定义的话OSEventType实用1字节,但是占用4字节,所以浪费空间。但是考虑人家是大牛人编的,有啥深意就难说了。
回复 支持 反对

使用道具 举报

19

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
172
金钱
172
注册时间
2013-7-23
在线时间
0 小时
发表于 2013-11-18 23:56:22 | 显示全部楼层
回复【11楼】lanny_cn:
---------------------------------
个人是这样理解的,结构体的最小对齐方式取决于结构体成员最大的最小对齐方式,这里应该为32位,即8个字节,所以不论是INT8U还是INT16U,在内存里都是占据了32位,(不够的位数补零)
回复 支持 反对

使用道具 举报

4

主题

117

帖子

0

精华

初级会员

Rank: 2

积分
153
金钱
153
注册时间
2013-8-20
在线时间
0 小时
发表于 2013-11-19 09:23:39 | 显示全部楼层
回复【12楼】chun_001:
---------------------------------
对于对齐理解我是非常清楚的,这里可能从8位机过来的仁兄们不太清楚,我简易的解释一下吧

对于32位机来说,一读读取内存最大是32位的(即4字节),所以对于地址0x....0/4/8/c的4字节值,一次读取即可。但是如果值是其它值,比如0x20000005的值来说,其占用是0x20000005-0x20000008,所以需要访问两次,向0x20000004取4字节(硬件支持也可以直接只读后三字节,这不做深究),并舍去前1字节,再访问0x20000008取4字节,舍去后3字节,两者再合并成4字节,才是我们所有的。

所以总结来说,如果访问4字节,地址是未对齐的,那么必须访问二次内存(访问块自动实现),对于2字节也一样,如果地址是奇数位,也必须访问二次内存。所以对于这种数据读写,自然比普通慢一倍。

对齐就是解决此问题的,在PC机上由于内存大,速度慢(相对CPU),所以默认都是内存对齐的。只有协议包的结构体,才需要设置紧密结构体(不对齐结构体)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-8 22:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表