关闭

TQ2440开发板学习纪实(10)--- 实现多任务处理,最简单OS模型

Keywords: Mutitasking,Context Switch,Thread 0 多任务(多线程,多进程)基本概念 0.1 CPU与多任务 对于“多任务(Multitasking)”,不同的应用领域有不同术语。在操作系统领域,一般称为“多任务”;在应用程序设计领域,一般称为“多线程”;而在Unix领域,更多的人喜欢用“多进程”来表示相同的意思。本文着眼于OS层,所以使用“多任务...
阅读(335) 评论(0)

C语言中通过全局变量引用汇编语言中的全局标签

汇编语言和C语言混合编程中,在C语言中通过全局变量来引用汇编中的数据定义非常普遍,然而却存在同名不同义的陷阱。1 测试代码在汇编语言中的定义整数变量studentID,并赋初值,如下: .global studentID .data studentID: .word 12345678 .text ldr r0, =studentID /* studentID被当...
阅读(729) 评论(0)

TQ2440开发板学习纪实(9)--- 利用Undefined异常模拟BLX指令

在博文 《紧急求助!ARM-GCC对于函数指针调用的编译有错误?》中,我提到了GCC在编译函数指针调用的时候,会生成绝对地址跳转指令BLX。而S3C2440A这款CPU不支持BLX指令,从而导致陷入Undefined异常。本文就利用这个Undefined异常,来模拟BLX指令,从而让使用BLX指令的程序可以正常运行在S3C2440上。1 Undefined异常的处理流程ARM9在执行未定义指令时,会...
阅读(338) 评论(1)

TQ2440开发板学习纪实(8)--- 从NAND Flash读取数据,把代码搬运到SDRAM运行

因为依赖于S3C2440的开机自动从Nandflash复制数据到片内SRAM执行,目前我们的可执行程序体积仍然不能大于4KB的限制。而我们的程序目前已经非常接近这个限制大小了,为了能够继续开发,必须突破这个限制。为此需要实现代码搬运功能,把程序从Nandflash搬运到SDRAM中去,并跳转到SDRAM执行。本文为啥不实现NandFlash写? 因为对于我们的实现目前尚未需求。更重要的是,写操作涉及...
阅读(559) 评论(0)

紧急求助!ARM-GCC对于函数指针调用的编译有错误?【已经找到原因】

函数指针是实现回调函数的基础,回调函数是C程序架构的基础。所以函数指针的重要性不言而喻。然而最近在ARM开发板上测试程序时,发现函数指针虽然能编译通过,但是运行时确总是报错。如下是一个最简单的测试程序源码。static void test() { puts("test\n"); }static void(*f)() = test; void Main(void) { led_init...
阅读(406) 评论(0)

TQ2440开发板学习纪实(7)--- 基于中断的UART串口接收

UART0的发送、接收、错误分别产生不同的中断,可以分别控制。本文仅对UART0的接收采用中断方式,发送仍然采用轮训方式。这样有个很大的用处,那就是程序陷入死循环是,可以通过UART0发送给ARM一个信号,来终止程序的运行。关键代码片段:1 取消相关中断屏蔽位/* unmask interrupt for UART0 */ rINTMSK &= ~(1<<28); rINTSUBMS...
阅读(342) 评论(0)

TQ2440开发板学习纪实(6)--- 启用IRQ中断,告别低效的轮询!

前面的实验中,无论是按键的状态,还是串口的发送接收状态,都是通过轮询的方式进行读取,不仅低效而且严重浪费CPU计算周期,在实际的生产环境下决不能使用!从本文开始,我们进进入一个新的时代,中断处理。0 中断、异常、软中断,傻傻分不清在CPU中断处理领域,术语比较混乱。而且有时候同一个术语在不同的语境含义也不相同。这里我们以S3C2440的数据手册为准解释相关概念。 异常,英文名Exception。是相...
阅读(594) 评论(0)

TQ2440开发板学习纪实(5)--- 设置UART串口,输出Hello World!

0 串口,UART,RS232,RS485傻傻分不清0.1 串行通信与并行通信串口名字表示采用的通信方式为串行而不是并行。那么串行与并行的区别是啥呢?很简单,串行就是同一时刻只能传输一个bit,而并行则可以同时传输多个bits。乍一看,仿佛并行通信速度更快,而且并行的信号线越多,传输数据快。CPU的总线就是使用并行通信的,总线带宽也从8一路飙升到了目前的64。然而这是在CPU的内部,对于设备间通信而...
阅读(740) 评论(0)

TQ2440开发板学习纪实(4)--- 初始化片外RAM,让程序有更大内存空间

到目前为止,我们的程序只能使用S3C2440的片内4KB的RAM。这么小的内存空间,显然不能应付实际的应用。是时候使用片外的RAM了,本文将详细介绍片外RAM的初始化过程。0 ROM,RAM,SRAM,DRAM,SDRAM傻傻分不清作为软件出身的软男,很难从根本上弄清楚ROM,RAM,SDRAM,SRAM等等的原理,这里我们只要了解基本的特性就可以了。 ROM,NorFlash: 只读内存,掉电不丢...
阅读(459) 评论(0)

TQ2440开发板学习纪实(3)--- 设置时钟频率,让CPU运行的更快

0 原理0.1 时钟源自哪里所谓的时钟,就是电压高低的变化,只有不断的0,1交替变化,CPU才能被驱动运行。S3C2440支持多种时钟源,这通过CPU针脚OM3和OM3来选择。对于QT2440板子来说,OM3和OM2均直接接地,这就意味着时钟源来自针脚XTIpll和XTOpll,这两个针脚在TQ2440的核心板上被连接上了一个12MHz的晶振。0.2 S3C2440的时钟原理与设置CPU、RAM、U...
阅读(2280) 评论(1)

一个C语言运算符优先级导致的问题

检测某个数的某个二进制位是否为0,是常见的控制逻辑,如下代码所示:if (x & (1<<2) == 0) { printf("x的第2个二进制位为0\n"); }然而实际上,上述代码永远不会执行printf,也就是说 x & (1<<2) == 0这个表达式始终为0。原因在于在C语言里,==运算符的优先级高于&,导致上面的表达式相当于:if ( x & ((1<<2) == 0) )因为1...
阅读(461) 评论(0)

TQ2440开发板学习纪实(2)--- 设置堆栈并调用C函数

本文根据上一篇TQ2440开发板学习纪实(1)—最简单的独立运行汇编程序进化而来。0 ARM堆栈(Stack)基础知识ARM支持满减类型的堆栈,满的意思是说堆栈指针SP(即R13)总是指向刚刚入栈的数据单元。与满相对应的就是不满,这种类型的栈指针SP指向栈顶的下一个空白单元。减的意思是说,栈底的内存地址大,栈顶地址小,压入数据时,栈向地址小的方向扩展。目前我们只有4KB的内存可用,范围为:0x000...
阅读(521) 评论(0)

TQ2440开发板学习纪实(0.1)--- GNU Freestanding(Naked)C ARM交叉开发环境创建与测试

0 由来在我的博文 GNU ARM交叉汇编环境的搭建与测试中,详细讲解了GNU ARM汇编环境的创建与使用方法。实际开发中,直接使用汇编语言写的代码往往很少,尽在系统启动和性能要求极其苛刻的时候才会用到汇编代码。在可读性、可移植性、逻辑表达能力方面,C语言的表现要比汇编强太多,正是C语言的这种优势造就了Unix世界,造就了Linux在多种平台上顺利编译运行的活泼场面。所以,在嵌入式开发领域,C语言是...
阅读(1812) 评论(1)

TQ2440开发板学习纪实(0.0)--- GNU ARM交叉汇编环境的搭建与测试

对ARM进行裸机开发时,汇编是必不可少的,因为C语言无法直接操作CPU的内置寄存器,也就无法完成很多硬件初始化的功能,如内存控制器的初始化。市面上大多数讲解ARM汇编开发的书籍都把ADS作为开发环境,因此使用的汇编语言也就是ARMASM,开发平台也限制到了Windows。然而在嵌入式领域,Linux作为开发环境更加普及,那么如何在Linux下进行ARM的汇编程序设计呢?其实,Linux平台上早就有了...
阅读(423) 评论(0)

Freestanding C与交叉编译器的生成原理分析

0 问题由来以前也用过C51写过简单的裸机程序,但是并没有认真的考虑过其与Linux环境下一般C语言程序的不同,只是想当然地认为C是跨平台的语言,并没有考虑过C语言的标准问题。今天在编译GCC交叉编译器时,遇到了种种问题,不得不重新考虑C语言的实现标准,否则很难清晰的了解交叉编译器的编译过程。1 C编译器的两种实现要求C语言标准的正式文档中明确提出了C编译器的两种实现标准:1.1 conformin...
阅读(722) 评论(0)

【转】TTL电平与RS232电平差异

转自:http://blog.csdn.net/skywalker_leo/article/details/18403351 这两天在调试带UART的蓝牙模块,由于刚开始分不清UART电平和RS232电平的区别,直接将蓝牙上UART的RX和TX接到PC上串口的TX和RX,导致所有数据都是乱码。后来才弄清楚:在UART上使用的TTL电平,而PC的串口是RS232,它有自己的电平定义,所以在...
阅读(421) 评论(0)

串口通信的基本知识

串口通信的基本知识本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。串口通讯,RS232,RS485,停止位,奇校验,偶校验1 串口通讯    串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。    串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。2 串口通讯...
阅读(711) 评论(0)

Linux系统调用图解(摘自《Assebly Language Step by Step》)

有图有真相,这个是目前我找到的解释Linux系统调用机制的最好图解。1 INT 80H 指令导致软中断,保存下一条指令地址到栈,IP寄存器装入80H号中断向量,进入Linux系统服务分配器。2 IRET 指令,之前保存到栈中的地址出栈赋给IP,中断返回到用户程序。...
阅读(483) 评论(0)

TQ2440开发板学习纪实(1)---最简单的独立运行汇编程序

0 如何做到简单TQ2440开发板,采用的CPU是三星S3C2440,核心板附加了2MB运行ROM和64MB运行RAM,并且搭配了64MB的Nand Flash。而S3C2440直接支持从NandFlash启动,其原理就是加电后,CPU内使用硬件逻辑把NandFlash开头的4KB数据复制到片内称之为stepping stone的特殊内存中。这个特殊的stepping内存只有在设置为Nandflas...
阅读(421) 评论(0)

最详尽解释Linux内核源码中的container_of宏及其标准C版本实现

在Linux内核源码文件 include/linux/kernel.h中,定义了container_of宏,源码如下:/** * container_of - cast a member of a structure out to the containing structure * @ptr: the pointer to the member. * @type:...
阅读(872) 评论(0)
457条 共23页1 2 3 4 5 ... 下一页 尾页
    个人资料
    • 访问:2252354次
    • 积分:21657
    • 等级:
    • 排名:第350名
    • 原创:335篇
    • 转载:108篇
    • 译文:14篇
    • 评论:375条
    博客专栏
    最新评论