LR

已经过了一周多了没动这个了,先发布文章吧,最近进入项目组,可能时间不大多,以后慢慢改。
或许可以近期将一些这里研究过的东西写些感受放上来

目标:
1.可以显示不同编码的汉字,可自行更换字体,更改字体大小
2. 不同方式显示,例如,横版,竖版,双屏等等
3.多种控制方式
4.良好的界面,足够的速度,文件大小回避等。
5.支持压缩文件

达成:
1.使用freetype2库,可以打印Unicode汉字,使用ttf字体,可更改字体大小
2.可以实现GBK的打印
3.简单排版
4.读取配置文件
5.显示速度
6.字型灰度表示
7.简单的自动排版
8.简单的按键控制
9.1bit的位图的显示
10.自动判断几种编码方式,Unicode,UnicodeBigEnd,GBK(兼容GB2312,兼容ANSI)。
11.文件列表,及文件选择
12.简单的键盘,笔操作实现

短期目标:
1.各种操作的结合行
2.文件列表的缓冲显示
3.书签
4.常用字符点阵缓存功能
5.支持压缩文件,至少要zip
6.看能否实现最大程度的编码范围,比如使用iconv库来实现


log:
2008
2月
16日:决定自己做一款阅读器,开始搜集资料
17:安装devkitpro以及palib,hellowold成功
18:尝试读取文本,读取文本成功,直接打印英文成功,中文失败
19:研究点阵字库打印
20:GBK字库打印失败,GB2312打印成功
21:使用各种方式尝试使用GBK字库(system.fon),失败。PS,这个fon字体是不是有问题啊。。。
22:放弃点阵字库,发现开源freetype库,简单研究,发现freetype for nds,还是先thanks一下 Robots w/lasers http://blog.davr.org/
23:简单查看文档,根据demo编制程序,编译失败
24:freetype2古怪的include编译器不支持,更改其为普通的include方式,编译成功,使用fat.h for nds(应该是有更改流方式的作用),字体读取成功。未有显示结果,研究palib bitmap处理,果然,是颜色未定义。汉字打印失败,英文成功。考虑编码问题,果然是编码问题,使用unicode编码文字替代原有文字,打印成功。开心,终于完成了一个目标。
25:荒废了一日,基本。无论怎么include,都提示各种输入方式的wchar方式未定义
26:继续尝试各种widechar方式,无奈没有一种可以成功。放弃,改为直接读取char,然后将char类型转换成wchar_t类型,基本成功。
27:发现windows下字体全是unicode,故想用windows的字体直接使用GBK编码文件是不可能的,唯一的方法是写出转换函数,将GBK(或者GB2312,GBK向下兼容)编码转换成unicode编码,也就是windows采用的codepage方式,nds估计没有codepage,自己编一个。从gbk编码表中提取了GB2312编码表,实现转换。
28:利用stlmap,实现gbk编码查找,速度的问题暂时不知道,等有空去nds上实际测试一下。测试效果,不如人意。速度慢,效果差。。。进行了简单的排版试验
29:字体调整中,实在是受不了那个难看的效果了,想到两种方法,一种将各种灰度表现出来,二,看能否转换成单色(这个bitmap可能会小)。采用第一种方法成功,r=g=b为各种灰度。速度问题,读字体的时候,是非常慢的。看来只有先将要显示的读出来的办法了,不然确实很慢。不过,有个关键在于,看书的时候,看完一页需要时间,这个时间用来缓存应该是足够的。搞定。发现一个libiconv可以转换编码,应该会有所帮助吧,但是我这周的主要工作就没了。。。。看见说simsun字体在小字号下使用嵌入式bitmap,1bit,我忘记考虑这个了,怪不得。应该要做进去,可以自动判断得到FTbitmap的类型。不过我找到一种load方式,FT_LOAD_NO_BITMAP,不使用嵌入的字体。算是一个偷懒的方法吧。对于字体,我简单将其居中,继续偷懒。。。
3.1:简单实现了自动排版。今天,从字体解脱吧。开始选择文件!实现了简单的按键控制,可以简单的翻页了,但是速度很不理想,主要是需要缓冲很长时间。需要开始考虑FT_CACHE的问题,也许会有所帮助。
3.2:搞定了1bit bitmap和gray bitmap之间的显示,都是抄的代码-_-!。实现了编码自动判断,这个有了就比较方便了,其实早就编好了,只是今天去将最后的判断代码编写一下if..else if..else... :-)调整灰度函数,现在显示效果还不错了。使用点阵字库显示文件列表,不过16点阵看起来有些大啊,找找12点阵的看
3.3:汉字常用的字符频率:最常用的140个字符占50%,常用的1000个汉字占90%的应用,所以,汉字cache的作用应该会是相当明显的。不过,cache就要写数据了,模拟器好像还不能。最好是针对字体的字号进行cache。为了减少开发复杂性,我决定将目录结构定死。因为,需要将txt文件放到指定的目录是一件可以接受的复杂度事件,但却我需要为这件事搞很多时间。但是我又想到,不支持目录的话,就会不方便管理书籍,这点比较麻烦。所有txt都放在一个目录下的话,似乎不好。不管怎么说,先做好了反色显示选择条目的功能,代码应该可以有很多改进,因为我复制了N回,多综合一下复用情况,应该可以改进。
3.4:实现了文件列表,以及浏览选择功能。现在还差书签功能,以及几个功能之间的调整和结合问题了,比如文件列表显示不全,显示了文本以后的输入问题,等等。然后除开主要功能就是性能方面的cache了。写了个半角全角的显示。今天好困啊,不想做事。
3.5:研究研究zip文件
3.6:已经荒废了两天,算上今天就是3天。不过还是比较慵懒。重新设计一下类吧。

03-15
<think>好的,我现在要回答用户关于ARM架构中Lr指令或概念的提问。首先,我需要确认用户的问题具体指的是什么。用户提到了“Lr指令或概念”,这可能涉及LR寄存器或者与LR相关的指令。根据提供的引用,特别是引用[2]和引用[4],我需要整理相关信息。 首先,查看引用[2],其中提到AArch32执行状态中的链接寄存器(Link Register,LR)。这说明LR在ARM架构中是一个重要的寄存器,用于存储函数返回地址。此外,引用[4]讨论了STREX指令,虽然与LR无直接关联,但帮助理解ARM的指令机制。 接下来,我需要确定LR的具体作用和相关的指令。例如,在函数调用时,BL指令会将返回地址存入LR。函数返回时,可以使用BX LR或者POP {PC}来跳转回LR中的地址。此外,异常处理中LR也会保存异常返回地址,如引用[2]提到的ELR(异常链接寄存器),这可能是在AArch64中的情况,但用户主要关注的是LR。 另外,需要区分AArch32和AArch64的不同。引用[2]指出,AArch32中的LR是32位的,而AArch64中可能没有LR,而是使用X30寄存器作为类似用途。这可能导致用户混淆,所以需要明确说明不同执行状态下的差异。 还要考虑其他涉及LR的指令,比如BLX、POP等。需要确认这些指令如何与LR交互,例如BLX不仅跳转还会将返回地址存入LR。同时,在异常处理中,如中断发生时,LR会保存异常返回地址,这与普通函数调用不同,可能需要特殊处理,如引用[2]提到的异常模型。 用户可能还关心LR在使用中的常见问题,比如在嵌套函数调用时需要保存LR的值,避免覆盖。这涉及到将LR压入堆栈的操作,例如使用PUSH {LR}或STR LR, [SP, #-4]!。 最后,根据引用[3],指令寄存器(IR)用于存储取到的指令,而PC是程序计数器,与LR不同。这可能帮助用户区分相关概念。 总结需要涵盖LR的定义、作用、相关指令,以及在不同执行状态下的差异,同时举例说明其使用场景和注意事项。</think>### ARM架构中的LR(Link Register)相关概念 在ARM架构中,**LR(Link Register)** 是⼀个重要的寄存器,主要用于存储函数调⽤或异常发⽣时的返回地址。以下是详细说明: --- #### 1. **LR的作⽤** - **函数调⽤返回地址**:当使⽤跳转指令(如 `BL`、`BLX`)调⽤⼦函数时,LR会⾃动保存当前指令的下⼀条地址(即返回地址)。例如: ```assembly BL 子函数 ; 跳转到子函数,并将返回地址存入LR ``` 子函数结束时,通过 `BX LR` 或 `MOV PC, LR` 返回主程序[^2]。 - **异常处理**:在ARM的异常处理(如中断)中,LR会保存异常返回地址。例如,在IRQ中断中,LR会存储**中断发⽣时的下⼜指令地址+偏移量**,需根据模式调整后使⽤[^2]。 --- #### 2. **与LR相关的指令** - **`BL` / `BLX`**:跳转并链接(Branch with Link),将返回地址存入LR。 ```assembly BL 目标地址 ; 跳转后,LR = 当前PC + 4(Thumb模式)或 + 8(ARM模式) ``` - **`BX LR`**:通过LR返回到调⽤者,例如函数结尾: ```assembly BX LR ; 跳转到LR中的地址 ``` - **`POP {PC}`**:通过堆栈恢复LR到PC(常见于函数返回): ```assembly POP {R0-R3, PC} ; 从堆栈恢复PC(等同于跳转回LR) ``` --- #### 3. **LR在不同执⾏状态下的差异** - **AArch32(32位模式)**: - LR是32位寄存器(R14),与PC(R15)分离。 - 异常处理中,不同模式(如IRQ、FIQ)有独⽴的LR副本,避免覆盖。 - **AArch64(64位模式)**: - LR被替换为**X30寄存器**,功能类似,但需通过 `RET` 指令返回: ```assembly RET X30 ; 等同于BX LR ``` --- #### 4. **LR的保存与恢复** 在嵌套函数调⽤或中断处理时,LR可能被覆盖,需⼿动保存到堆栈: ```assembly PUSH {LR} ; 保存LR到堆栈 BL 子函数 POP {LR} ; 恢复LR ``` --- #### 5. **示例:函数调⽤与返回** ```assembly 主函数: BL 子函数 ; LR = 主函数中下一条指令地址 ... 子函数: PUSH {LR} ; 保存LR(若嵌套调⽤) ... POP {PC} ; 恢复LR到PC,实现返回 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值