摘要:
在单片机开发中,我们借助于vsprintf函数,可以自己实现一个printf函数,但是,那是IDE帮我们做了一些事情。 刚开始在ARM9裸机上自己写printf的实现的时候,包含对应头文件也会提示vsprintf函数找不到,查询很多资料之后,发现使用arm-linux-ld就是找不到对应的库函数,换 阅读全文
摘要:
s3c2440的异常向量表: IRQ中断地址是0x18.所以,根据之前的异常处理方式,我们编写启动文件: 为什么需要lr减4,可以参考这篇文章:http://blog.csdn.net/zzsfqiuyigui/article/details/23334177 这是为了保证,当cpu正在执行某条指令 阅读全文
摘要:
系统复位的时候,从0地址开始执行,这个时候系统处于svc管理模式。 一般而言,我们的app应用程序是处于用户模式的,但是用户模式不能访问硬件,必须处于特权模式才可以。所以这里我们用swi软中断方式来实验。swi异常会让cpu进入svc模式。 首先,系统复位,执行代码,此刻处于svc模式,然后我们切换 阅读全文
摘要:
现在做第一个实验,模拟未定义模式。 未定义模式,是cpu遇到自己不能识别的指令时候做出的异常处理。 arm指令的机器码一定是按照某种规范要求的,不然你随意写一条指令,cpu不是都可以执行吗?在cpu没有定义该条指令含义的情况下,我们执行了这样未定义的指令,就会进入未定义异常。 现在我们要模拟一个未定 阅读全文
摘要:
之前我们的启动文件清除bss和拷贝都是通过汇编的方式的实现,但是,我们能够使用C语言,就不使用汇编: 先看连接脚本: 现在我们编写C语言的copy和clean函数,但是在我们的c程序中,需要访问连接脚本中的符号。 先看代码,稍后解释: start.S部分展示: 先不管连接脚本的引用,我们现在讨论一个 阅读全文
摘要:
今天在使用中移动的模组的时候,发现: 突然把我难住了,ctrl+z要在我的数据包中通过TCP/IP发送,而结束字符肯定是需要我自己加在数据包的末尾的。 故,做如下测试: 我的输入是ctrl+z(小z),ctrl+Z(大写z),ctrl+A,+B,+C,+D,+E,+F. 得出结论是,ctrl+字母a 阅读全文
摘要:
通过前面的学习,我们知道,把可执行程序从一个位置复制到另一个位置的过程叫做重定位。 现在有两种方式,第一种是只重定位data段到内存(sdram),为什么需要重定位?因为有些flash的写操作,不是简单地内存访问,通常我们使用sdram这个介质作为程序运行的载体。但是只重定位data段这种方式存在弊 阅读全文
摘要:
假设你已经看过FreeRTOS 事件标志组这篇随笔了。 之前的基础篇,真的就只是简单了解一下,相当于大学实验室的实验,但是,我们实际公司项目中,需要更多地思考,就算我们之前只是学习了基础概念以及基础语法,只要我们勤加思考,就能灵活的运用基础知识了,基础是内功,基础打好了,功力自然上升。 事件标志组的 阅读全文
该文被密码保护。 阅读全文
摘要:
上一篇随笔说了,需要清除bss段,我们现在定义main函数如下: 注意这个全局变量是没有初始值的,即存放在bss段中,如果我们的启动文件没有清除bss段,串口的输出将是你想不到情况。比如,现在程序运行执行了++操作20次,你下次快速断电再上电的时候,g_Char2的值是接着之前的值增加的,而增加了清 阅读全文
摘要:
上篇随笔写了一个连接脚本,如果你不想看那个复杂的ld连接脚本文章,看我上一篇和这篇随笔就可以做到编写目前我们够用的连接脚本了,本章的知识点全部来自那篇文章。 先看连接脚本的格式: 其中有一些东西我们是不会用到的: 第一个,段名,这个我们可以随便取,但是一般按照.data .text等这样的名字,也可 阅读全文
摘要:
关于段的脚本语法编写可以参考: 参考资料:Using LD, the GNU linker 关于重定位可以参考我之前的一篇随笔: ld,连接器 简单通俗一点来说,就是把可执行代码放在内存的另一个地方去。 比如,我的bin文件烧写在nor flash上,在前2k存放代码段,紧接着存放.data段,此时 阅读全文
摘要:
对于2440而言,nand启动,nand的前4k内容由硬件复制到sram。 nor flash,可以像内存一样读,但是不能像内存一样写,执行写操作需要特殊的操作。 程序中包含有需要写的全局或者静态变量,它们在bin文件中,写在nor flash上,直接修改这样的变量是无效的。 到底什么意思呢?还是看 阅读全文
摘要:
前面我们实验的LED和串口程序,是cpu发送地址给特定的寄存器,在寄存器中写相应的位,达到控制要求。 第一类是GPIO门电路如LED,第二类是协议类如串口,这些都不是cpu直接给地址信息,而是通过寄存器来控制的。 第三类是内存接口,cpu发出的地址可以直接传递给这种设备如nor flash,sdra 阅读全文
摘要:
2440A有三个串口,我们使用串口0对它进行了解熟悉。 首先肯定是应该找到手册上串口0所对应的引脚,然后配置相应寄存器。 串口0对应GPIO H的 2,3 串口在单片机中我们已经有很多使用经验了,对于协议采用 8-N-1,8bit数据位,无校验,1停止位。 说明波特率的计算方式: 把串口对应IO配置 阅读全文