我的学习之旅(15)tty.c
来源:互联网 发布:sql语句where条件查询 编辑:程序博客网 时间:2024/04/27 04:15
模仿linux tty,建立一个console,通过对console的写操作完成字符的显示。
tty.c源代码:
#include <stdarg.h>#include <mem.h>#include <tty.h>#include <console.h>#include <system.h>static tty_struct_t g_tty_table[MAX_CHANNEL_ID];void tty_init(void){ int i; for(i=0;i<MAX_CHANNEL_ID;i++) { memset((unsigned char *)&g_tty_table[i], 0x0, sizeof(tty_struct_t)); } g_tty_table[CONSOLE_ID].write = console_write;}unsigned char get_char_from_queue(tty_queue_t *q){ unsigned char ch = q->buf[q->tail]; q->tail = ( q->tail + 1 ) & (TTY_BUF_SIZE-1); return ch;}void put_char_into_queue(tty_queue_t *q, char ch){ q->buf[q->head] = ch; q->head = ( q->head + 1 )&(TTY_BUF_SIZE - 1); return;}void tty_write(tty_struct_t *tty, char *buf, unsigned int len){ char *up = buf; char ch; if( !tty || !buf || len == 0 || len > 1024) return; if( tty->write == NULL ) { return; } //入write_q队列 while(len > 0 && (((tty->write_q.tail-tty->write_q.head-1)&(TTY_BUF_SIZE-1)))) { //保证队列没满 ch = up[0]; up++; len--; tty->write_q.buf[tty->write_q.head] = ch; tty->write_q.head = (tty->write_q.head+1) & (TTY_BUF_SIZE-1); } return tty->write(tty, buf ); }tty_struct_t *get_tty(unsigned int channel_id){ if( channel_id >= MAX_CHANNEL_ID) return NULL; return &g_tty_table[channel_id];}
tty.h的源代码:
#ifndef __TTY_H__#define __TTY_H__#define TTY_BUF_SIZE 1024enum { CONSOLE_ID= 0, MAX_CHANNEL_ID};typedef struct tty_queue_s {unsigned long data;unsigned long head;unsigned long tail;char buf[TTY_BUF_SIZE];}tty_queue_t;typedef struct tty_struct_s { tty_queue_t read_q; tty_queue_t write_q; void (*write)(void *tty, char *buf); unsigned int task_id;}tty_struct_t;void tty_init(void);tty_struct_t *get_tty(unsigned int channel_id);unsigned char get_char_from_queue(tty_queue_t *q);#endif
0 0
- 我的学习之旅(15)tty.c
- 我的c 数据结构学习之旅 顺序表未完
- 我的学习之旅(12) main.c
- 我的学习之旅(13) printk.c
- 我的学习之旅(14)printk.c
- 我的学习之旅(21)vsprintf.c
- 我的学习之旅(22)vsprintf.c
- 我的学习之旅(22)vsprintf.c
- 我的学习之旅(20)vsprintf.c
- 我的学习之旅(21)vsprintf.c
- 我的学习之旅(34) sched.c
- 我的学习之旅(35)sched.c
- 我的学习之旅(36) sched.c
- 我的学习之旅(37) sched.c
- 我的学习之旅(38) sched.c
- 我的学习之旅(39) sched.c
- 我的学习之旅(40) sched.c
- 我的学习之旅(41)sched.c
- Android的系统服务一览
- Hibernate get和load区别
- CoreMotion框架-iOS设备的核心运动
- 市场退房难!东郊半岛花园的无理由退房还能信吗?
- android隐去标题栏
- 我的学习之旅(15)tty.c
- 修复ubuntu的grub的方法
- 基于Lambda架构的数据实时计算系统
- 公司守则
- Express Api 翻译[二] ——Request篇
- android 打印日志信息到sdcard
- 如何在Fragment中使用ViewPager,并实现导航随手势滑动效果
- mybatis实战教程,mybatis入门到精通
- HTTP消息的格式