第二讲 硬件I/O操作zz
来源:互联网 发布:知乎 特朗普 希拉里 编辑:程序博客网 时间:2024/06/01 13:04
发信人: gdtyy (gdtyy), 信区: Embedded
标 题: 第二讲 硬件I/O操作
发信站: 水木社区 (Mon Jun 25 23:29:42 2007), 站内
**********************
* 第二讲 硬件I/O操作 *
**********************
2006/12/27 asdjf@163.com www.armecos.com
对设备进行访问和控制时需要访问I/O寄存器。硬件抽象层提供了一些宏用于I/O寄存器
的读写操作。
之所以不用指针直接操作,目的是为了可移植性。使用宏的原因是避免函数调用引起的
性能损失。ecos是一种可移植的嵌入式操作系统,它可以移植到16位、32位、64位的各种处
理器平台上。ecos由各种组件构成,根据具体硬件平台的需要可以分别将这些组件加入到系
统中来,从而实现各种所需的功能。ecos的这种层次结构的最底层是硬件抽象层(Hardware
Abstraction Layer),通常称为HAL。硬件抽象层HAL对处理器结构和系统硬件平台进行抽象
,当需要在一个新的目标平台上运行ecos时,只需对底层的硬件抽象层进行修改,便可迅速
地将整个ecos系统移植到新的平台上。
常用I/O操作宏:
读寄存器值 从寄存器读数据并将结果存放在存值变量里
HAL_READ_UINT8(寄存器地址,存值变量);
HAL_READ_UINT16(寄存器地址,存值变量);
HAL_READ_UINT32(寄存器地址,存值变量);
写寄存器 向寄存器写如数值
HAL_WRITE_UINT8(寄存器地址,值);
HAL_WRITE_UINT16(寄存器地址,值);
HAL_WRITE_UINT32(寄存器地址,值);
这些宏位于头文件cyg/hal/hal_io.h内,感兴趣的读者可以看看这些宏是怎么实现的。
I/O操作宏的定义也是按照ecos的分层原则定义的,HAL表示这是硬件抽象层函数,
READ/WRITE表示具体操作,UINTx表示读写宽度,这些宏很容易记忆的,而且见名知意。
寄存器名称定义在cyg/hal/plf_io.h中,我们仍然按照ecos命名规则起名,如下:
// GPIO
#define LPC2XXX_GPIO_IO0PIN 0xE0028000
#define LPC2XXX_GPIO_IO0SET 0xE0028004
#define LPC2XXX_GPIO_IO0DIR 0xE0028008
#define LPC2XXX_GPIO_IO0CLR 0xE002800C
LPC2XXX表示芯片型号,GPIO表示I/O类型,IO-n-ops表示Pn口的操作方式(引脚、方向
、设置、清除)。这样的命名比枯燥的数字更容易记忆,不重名也不易错。
下面是控制GPIO让蜂鸣器发声的应用程序,响1秒停1秒,周而复始。线程创建第一讲已
经说过,不再重复。
#include <cyg/kernel/kapi.h>
#include <cyg/hal/hal_io.h>
#include <cyg/hal/plf_io.h>
#define STACK_SIZE 4096
#define BEEPCON 0x0000080
char stack[2][STACK_SIZE];
static cyg_thread thread_data[2];
static cyg_handle_t thread_handle[2];
void taska(cyg_addrword_t data)
{
int message = (int) data;
HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0DIR,BEEPCON);
for(;;)
{
HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0SET,BEEPCON);
cyg_thread_delay(100);
HAL_WRITE_UINT32(LPC2XXX_GPIO_IO0CLR,BEEPCON);
cyg_thread_delay(100);
}
}
void
test(cyg_addrword_t data)
{
printf("/n/n/n");
printf("/t *******************************/n");
printf("/t * Hello! The world. */n");
printf("/t *******************************/n/n/n");
// Create a main thread, so we can run the scheduler and have time 'pass'
cyg_thread_create(10, // Priority - just a number
taska, // entry
1, // entry parameter
"taska", // Name
&stack[1], // Stack
STACK_SIZE, // Size
&thread_handle[1], // Handle
&thread_data[1] // Thread data structure
);
cyg_thread_resume(thread_handle[1]); // Start it
}
void
cyg_start(void)
{
// Create a main thread, so we can run the scheduler and have time 'pass'
cyg_thread_create(10, // Priority - just a number
test, // entry
0, // entry parameter
"test", // Name
&stack[0], // Stack
STACK_SIZE, // Size
&thread_handle[0], // Handle
&thread_data[0] // Thread data structure
);
cyg_thread_resume(thread_handle[0]); // Start it
cyg_scheduler_start();
}
--
※ 来源:·水木社区 http://newsmth.net·[FROM: 61.149.56.*]
- 第二讲 硬件I/O操作zz
- I/O端口 zz
- 小何讲Linux: 底层文件I/O操作
- Linux I/O资源 (ZZ)
- Linux I/O资源 (ZZ)
- (zz)I/O PAD design
- 硬件- I/O 与 总线
- [操作系统] I/O硬件原理
- 第六讲 串口操作zz
- 第二讲 CRUD操作
- 理解I/O Completion Port (zz)
- 设备I/O之OVERLAPPED(zz)
- 什么是I/O流,缓存(zz)
- C++I/O操作
- I/O操作
- I/O操作
- 文件I/O操作
- 文件I/O操作
- VxWorks之MUX网络驱动在EasyARM2200和SmartARM2200上的实现zz
- VxWorks for LPC2210网络应用编程实战zz
- 利用Servlet上传文件(在servlet中处理MIME类型的post数据)
- ecos在EASYARM2200和SMARTARM2200上的应用合集zz
- interfaces in Junos
- 第二讲 硬件I/O操作zz
- 第三讲 ecos中断操作zz
- Stop-Service 帮助信息
- 第四讲 UDP编程zz
- 利用HttpModule做流量记录 画蛇添足最后一笔
- 第五讲 TCP编程zz
- javascript一些正则表达式
- 第六讲 串口操作zz
- 第七讲 文件系统zz