hal_dev.c
来自「基于ARM和uC/OS-II实现的串口控制台」· C语言 代码 · 共 121 行
C
121 行
#include "../../inc/dev/hal_unistd_dev.h"
#include "../../inc/dev/hal_file.h"
#include "../../inc/dev/hal_dev_llist.h"
#include "../../inc/pub/hal_types.h"
#include "../../inc/pub/hal_errno.h"
#include <stdio.h>
/*
* "hal_dev_list" 是注册的设备链表的头. 它被配置为启动时包含一个设备
* 即 "hal_dev_null"。
*/
extern hal_dev hal_dev_null;
hal_llist hal_dev_list = {&hal_dev_null.llist, &hal_dev_null.llist};
/*
* hal_dev_null_write() 是hal_dev_null设备的写函数,该函数被调用时
* 什么都不作,仅仅丢弃数据,然后返回写入成功。
*/
static int hal_dev_null_write (hal_fd* fd, const char* ptr, int len)
{
return len;
}
/*
* "hal_dev_null"主要用于输出重定向,这个设备是hal_sys_init()被调用前系统
* 唯一的器件,stdin, stdout stderr在系统启动时到被定向到这个设备,以使得
* 一些系统调用是安全的,比如如果移植了C运行时库,那么在设备被注册前,调用
* printf()函数也做到是安全的
*/
hal_dev hal_dev_null =
{
{
&hal_dev_list,
&hal_dev_list
},
"/dev/null", /*器件名字*/
NULL, /* open */
NULL, /* close */
NULL, /* write */
hal_dev_null_write, /* write */
NULL, /* lseek */
NULL, /* fstat */
NULL /* ioctl */
};
/*
* "hal_fd_list_lock" 为控制文件描述符链表访问的信号量,用于保证对它的
* 访问是线程安全的。
*/
//HAL_SEM(hal_fd_list_lock)
/*
* "hal_max_fd" 用于指出已经分配的文件描述符的最大值,使得对文件描述符
* 的访问变得高效,不用每次搜索完整个文件描述符表(未分配的不搜索)
*/
hal_32 hal_max_fd = -1;
/*
* "hal_fd_list" 是文件描述符表,在这个数据中,最先的三个元素被配置为
* standard in, standard out, 和 standard error。剩余的则为未分配。
*
* HAL_MAX_FD为一个宏,指出最多可以支持的文件描述符个数。
*/
hal_fd hal_fd_list[HAL_MAX_FD] =
{
{
&hal_dev_null, /* standard in */
0,
0
},
{
&hal_dev_null, /* standard out */
0,
0
},
{
&hal_dev_null, /* standard error */
0,
0
}
};
int hal_dev_llist_insert (hal_dev_llist* dev, hal_llist* list)
{
if (!dev || !dev->name)
{
return -EINVAL;
}
hal_llist_insert(list, &dev->llist); /* 注册设备 */
return 0;
}
/*
* The hal_dev_reg() 用于在系统中注册一个设备,一旦注册成功就可以利用标准
* 的posix调用来操作该器件,如open(), read(), write()等
*
* 注意,如果要注册的设备名字与系统中已注册的设备的名字相同,则操作的结果
* 会带来问题。
*/
int hal_dev_reg (hal_dev* dev)
{
if (!dev->name) /* 检查器件的名字是否有效 */
{
return -EINVAL;
}
hal_llist_insert(&hal_dev_list, &dev->llist); /* 注册设备 */
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?