1.优秀的源码 Verilog/FPGA开源项目介绍(十)- H.264和H.265
2.俄罗斯方块的源代码?
3.电脑代码视频文件代码电脑文件类型代码
4.pascalè¯è¨
5.字符设备中的几个函数分析
6.如何用css js制作计算器?
优秀的 Verilog/FPGA开源项目介绍(十)- H.264和H.265
H.是ITU-TVCEG在H.之后推出的新视频编码标准,它在保留H.某些技术的源码基础上,对相关技术进行了改进。源码H.采用了先进技术,源码以优化码流、源码编码质量、源码php投票系统 源码延时和算法复杂度之间的源码关系,旨在提高压缩效率、源码鲁棒性和错误恢复能力,源码减少实时延时和信道获取时间,源码降低复杂度。源码
H.,源码即MPEG-4第十部分,源码是源码由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT)提出的高度压缩数字视频编解码器标准。H.的源码最大优势是其高数据压缩比率,在同等图像质量的条件下,其压缩比是MPEG-2的2倍以上,是MPEG-4的1.5~2倍。
H.旨在在有限带宽下传输更高质量的网络视频,仅需原先的一半带宽即可播放相同质量的视频。这意味着,我们的点评体验源码智能手机、平板机等移动设备将能够直接在线播放p的全高清视频。H.标准也同时支持4K(×)和8K(×)超高清视频。
H.与H.的不同之处在于,H.在H.的基础上进行了改进,包括帧内预测、帧间预测、转换、量化、去区块滤波器和熵编码等模块。H.的编码架构大致上与H.相似,但整体被分为三个基本单位:编码单位(CU)、预测单位(PU)和转换单位(TU)。
复旦大学H./H.开源IP,包括H. Video Encoder IP Core,是由复旦大学专用集成电路与系统国家重点实验室(State Key Lab of ASIC & System,Fudan University)视频图像处理实验室(VIP Lab)范益波教授研究团队开发完成,并开放源代码。
开源地址:openasic.org
关于上板验证,网站上有相关的验证板卡代码,如下:
github上的开源H.,开源地址:github.com/tishi/h...
用verilog和system verilog编写,翼虎源码在FPGA板上用Xilinx ZYNQ验证,运行最高MHZ。
内容:文件夹“src”包含所有解码源文件。文件夹“tb”包含测试台文件,ext_ram_.v使用axi3接口模拟ddr。文件夹“pli_fputc”是verilog pli,用于在运行模拟时将输出bin写入文件。
使用方法:模拟:将所有测试平台和源代码文件添加到您的模拟项目源中,例如modelsim。将测试文件in.放到您的模拟项目文件夹中。然后运行,例如,对于modelsim,运行“vsim -pli pli_fputc.dll bitstream_tb”。输出是out.yuv和一些日志文件。
在FPGA板上运行:将“src”文件夹中的源文件添加到您的FPGA项目中。顶部文件是decode_stream.sv。两个接口,stream_mem_xxx用于将H比特流馈送到解码器。
github上的开源H.,开源地址:github.com/aiminickwong...
无介绍
说明:第一个项目由复旦大学专用集成电路与系统国家重点实验室(State Key Lab of ASIC & System,大型通讯源码Fudan University)视频图像处理实验室(VIP Lab)推出,不论项目完成度还是文档说明,都非常详细,同时上面给的是该项目的论坛,论坛上有相关工作人员维护,活跃度很高,适合去学习使用。
后面两个项目,碎碎并没验证过,但是感觉不怎么靠谱,README完整度不高,有兴趣的可以去看看。
最后,还是感谢各个大佬开源的项目,让我们受益匪浅。后面有什么感兴趣方面的项目,大家可以在后台留言或者加微信留言,今天就到这,我是爆肝的碎碎思,期待下期文章与你相见。
优秀的试吃团源码 Verilog/FPGA开源项目介绍(九)- DP(增改版)
优秀的 Verilog/FPGA开源项目介绍(八)- HDMI
优秀的 Verilog/FPGA开源项目介绍(七)- CAN通信
介绍一些新手入门FPGA的优秀网站(新增2)
优秀的 Verilog/FPGA开源项目介绍(六)- MIPI
优秀的 Verilog/FPGA开源项目介绍(五)- USB通信
优秀的 Verilog/FPGA开源项目介绍(四)- Ethernet
优秀的 Verilog/FPGA开源项目介绍(三)- 大厂的项目
优秀的 Verilog/FPGA开源项目介绍(二)-RISC-V
优秀的 Verilog/FPGA开源项目介绍(一)-PCIe通信
俄罗斯方块的源代码?
#include <graphics.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
void draw_block(int x,int y,int style,int way);
void kill_line(int y);
void draw_little_block(int x,int y,int z,int style);
int check_block(int x,int y,int style);
int change(int *i,int *j,int key);
int style1,style,score,speed,l;
int board[][];
char str[];
struct shape
{
int xy[8],next;
};
struct shape shapes[]= /* 种方块(前
8个点表示4个小方块的相对位置 第9点表示类型) */
{
{
0,-2, 0,-1, 0, 0, 1, 0, 1
},
{ -1, 0, 0, 0, 1,-1, 1, 0, 2},
{ 0,-2, 1,-2, 1,-1, 1, 0, 3},
{ -1,-1,-1, 0, 0,-1, 1,-1, 0},
{ 0,-2, 0,-1, 0, 0, 1,-2, 5},
{ -1,-1, 0,-1, 1,-1, 1, 0, 6},
{ 0, 0, 1,-2, 1,-1, 1, 0, 7},
{ -1,-1,-1, 0, 0, 0, 1, 0, 4},
{ -1, 0, 0,-1, 0, 0, 1, 0, 9},
{ 0,-2, 0,-1, 0, 0, 1,-1,},
{ -1,-1, 0,-1, 1,-1, 0, 0,},
{ 0,-1, 1,-2, 1,-1, 1, 0, 8},
{ -1, 0, 0,-1, 0, 0, 1,-1,},
{ 0,-2, 0,-1, 1,-1, 1, 0,},
{ -1,-1, 0,-1, 0, 0, 1, 0,},
{ 0,-1, 0, 0, 1,-2, 1,-1,},
{ 0,-3, 0,-2, 0,-1, 0, 0,},
{ -1, 0, 0, 0, 1, 0, 2, 0,},
{ 0,-1, 0, 0, 1,-1, 1, 0,}
};
#define MAPXOFT 9 /* 第1个方块的位置 */
#define MAPYOFT 5
#define MAPXOFT1 /* 下一个方块的位置 */
#define MAPYOFT1
#define LEFT 0x4b
#define RIGHT 0x4d
#define DOWN 0x
#define UP 0x
#define ESC 0xb
#define ENTER 0x1c0d
int main()
{
int gdriver,gmode,
i,j,key,x0=5,y0=1,m,n,c,key1,p,q,le=0,b;
l=1,score=0;
gdriver=DETECT;
initgraph(&gdriver,&gmode,"D:\\TURBOC2");
randomize();
for(m=0;m<=;m++)
for(n=0;n<=;n++)
board[m][n]=0; /* 初始游戏版 */
setcolor(); /* 开机的画面 */
settextstyle(0,0,3);
outtextxy(,,"WELCOME TO RUSSIS");
outtextxy(,,"READY GO");
setcolor();
settextstyle
(0,0,4);
outtextxy(,,"^_^");
/
*circle(,,);
ellipse(,,,,,);
ellipse(,,,,,);
ellipse(,,,,,);*/
getch();
settextstyle(0,0,1);
cleardevice();
setcolor(LIGHTRED); /* 画出游戏所在的范围图
*/
setlinestyle(0,0,3);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor(LIGHTRED);
setlinestyle(0,0,3);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor(LIGHTRED);
setlinestyle(0,0,3);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,BLUE);
rectangle(,,,);
floodfill(,,LIGHTRED);
setcolor();
for(m=0;m<=;m=m+2)
ellipse(,,0,,+m,+m);
setcolor();
setfillstyle(1,0);
circle(,,);
floodfill(,,);
outtextxy(,,"* you can change the game");
/* 对游戏的说明 */
outtextxy(,,"-speed and the gradth by"); /
*上为变形 左右 为 调整
下为快下 ESC为退出 */
outtextxy(,," using 'up'and'down'.");
outtextxy(,,"* when you are plying the");
outtextxy(,,"game,you can use these pu");
outtextxy(,,"-tturns.");
outtextxy(,,"* if you want to go into t");
outtextxy(,,"-he game,please 'enter'.");
outtextxy(,,"* you can chang shapes ");
outtextxy(,," using UP");
outtextxy(,,"* RIGHT and LEFT can" );
outtextxy(,," move shapes");
outtextxy(,,"GAMESPEED:");
outtextxy(,,"GRADTH:");
printf("\n\n\n 1");
printf("\n\n\n\n 0");
/* setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED); */
outtextxy(,,"SCORES:");
outtextxy(,,"**The speed will");
outtextxy(,,"increas if score");
outtextxy(,,"increas 3");
for(p=0;p<=;p++) /* 对速度的调整 */
{ key=bioskey(0);
if(key==ENTER)
break;
if(key==UP)
{
if(l==9)
l=9;
if(l<9)
l++;
}
if(key==DOWN)
{
if(l==1)
l=l;
if(l>1)
l--;
}
gotoxy(2,4);
printf("%d",l);
}
for(q=0;q<=;q++) /* 对高度的调整 */
{
key=bioskey(0);
if(key==ENTER)
break;
if(key==UP)
{
if(le==5)
le=le;
if(le<5)
le++;
}
if(key==DOWN)
{
if(le==0)
le=le;
if(le>0)
le--;
}
gotoxy(2,8);
printf("%d",le);
}
key=bioskey(0);
if(key==ENTER)
{
style=random();
for(m=1;m<=le;m++) /* 具体的对高度的调整 */
{
b=random(7)+1;
for(n=1;n<=;n++)
{
if(random(2))
{
board[n-1][-m]=1;
draw_little_block(MAPXOFT+n,MAPYOFT+-m,1,b);
}
}
}
while(1)
{
while(1)
{
i=x0,j=y0;
style1=random();
setcolor(); /* 画出下一个方
块 */
draw_block(MAPXOFT1,MAPYOFT1,style1,1);
for(j=y0;j<=;j++)
{
while(1)
{
if(bioskey(1)) /* 方块的
调整 */
{
key=bioskey(0);
change(&i,&j,key);
}
if(!check_block
(i,j+1,style)) /* 判断方块能不能下降 */
break;
if(j==)
break;
if(speed==1)
{
draw_block
(i,j,style,0); /* 方块的下降 */
j++;
draw_block
(i,j,style,1);
delay();
}
if(speed!=1)
{
m++;
delay
();
if(m>=3*(-l))
{
m=0;
draw_block
(i,j,style,0); /* 方块的下降 */
j++;
draw_block
(i,j,style,1);
}
}
}
speed=0;
for(m=0;m<=6;m+=2) /* 对有方块的位置给予1
的数值 */
board[i+shapes[style].xy[m]-1]
[j+shapes[style].xy[m+1]-1]=1;
if(board[ i][4]==1)
{
setcolor();
settextstyle(0,0,2);
outtextxy(,,"CAREFUL -_-");
delay();
delay();
setcolor(0);
outtextxy(,,"CAREFUL -_-");
settextstyle(0,0,1);
setcolor(LIGHTRED);
}
/* setcolor(LIGHTRED);
setlinestyle(0,0,1);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);*/
if(l==1) /* 显示当前游戏等级 */
{
setcolor(LIGHTRED);
setlinestyle(0,0,1); /* 容易的速度 */
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
outtextxy(7,," easy speed");
}
if(l==4)
{
setcolor(BLACK);
outtextxy(7,," easy speed");
setcolor(LIGHTRED); /* 中等难度 */
setlinestyle(0,0,1);
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
outtextxy(7,," normal speed");
}
if(l==7)
{
setcolor(BLACK);
outtextxy(7,," normal speed");
setcolor(LIGHTRED);
setlinestyle(0,0,1); /* 困难的难度 */
setfillstyle(1,);
rectangle(,,,);
floodfill(,,LIGHTRED);
outtextxy(7,," hard speed");
}
kill_line(j);
if(j==)
break;
if(!check_block(i,j+1,style))
break;
}
draw_block(MAPXOFT1,MAPYOFT1,style1,0);
/* 对下1个方块显示位置进行覆盖 */
style=style1; /* 使的方块和显示的方块一样
*/
if(j==1) /* 关机的画面 */
{
setcolor();
settextstyle(0,0,2);
outtextxy(,,"GAME OVER");
outtextxy(,,"THANK YOU");
sleep(3);
exit(0);
}
}
}
}
getch();
}
int change(int *i,int *j,int key) /* 方块的具体的变化(
移动 变形 下降) */
{
if(key==UP&&check_block(*i,*j,shapes[style].next)) /
*变形 */
{
draw_block(*i,*j,style,0);
style=shapes[style].next;
draw_block(*i,*j,style,1);
}
else if(key==LEFT&&check_block(*i-1,*j,style)) /* 移动
*/
{
draw_block(*i,*j,style,0);
(*i)--;
draw_block(*i,*j,style,1);
}
else if(key==RIGHT&&check_block(*i+1,*j,style))
{
draw_block(*i,*j,style,0);
(*i)++;
draw_block(*i,*j,style,1);
}
else if(key==DOWN&&check_block(*i,*j+1,style)) /* 下降
*/
{
draw_block(*i,*j,style,0);
(*j)++;
draw_block(*i,*j,style,1);
speed=1;
}
else if(key==ESC) /* 退出 */
exit(0);
}
void draw_block(int x,int y,int style,int way) /* 画出方块
的位置 */
{
int x1=x+MAPXOFT,y1=y+MAPYOFT;
int i;
if(way==1)
{
setcolor(WHITE);
}
else
{
setcolor(BLACK);
}
for(i=0;i<=6;i+=2)
{
draw_little_block(x1+shapes[style].xy[
i],y1+shapes[style].xy[i+1],way,style);
}
}
void draw_little_block(int x,int y,int z,int style) /* 画
出方块的每一个小方块的形状(方块的色彩) */
{ int m,n;
if(z==1) /* 对色彩的调整 */
{
if(0<=style&&style<=3)
n=2;
if(4<=style&&style<=7)
n=3;
if(8<=style&&style<=)
n=4;
if(<=style&&style<=)
n=5;
if(<=style&&style<=)
n=6;
if(<=style&&style<=)
n=7;
if(style==)
n=8;
m=1;
}
if(z==0)
{
m=0,n=0;
}
setcolor(m);
setfillstyle(1,n);
rectangle(x*,y*,x*+,y*+);
floodfill(x*+2,y*+2,m);
}
void kill_line(int y) /* 消行 */
{
int i,t=1,j,k,color=random(7)+1;
for(;y>=1&&t<=4;y--,t++) /* 对4行进行验证 */
{
for(i=1;i<=;i++)
if(!board[i-1][y-1]) /* 严整1行的数组是不是全
为1 */
break;
if(i==)
{
setcolor(LIGHTRED); /* 对积分底色的画法
*/
setlinestyle(0,0,1);
setfillstyle(1,BLUE);
rectangle(,,,);
floodfill(,,LIGHTRED);
score++; /* 每消去1行 可以得1分 */
setcolor();
itoa(score,str,);
outtextxy(,,str);
if(score!=0&&score%3==0)
l++; /* 每次分到一定位置是 速度进
行提高(目前是3行加1次 可以调整) */
setcolor(); /* 每次消去是进行庆祝模式 */
settextstyle(0,0,4);
outtextxy(,,"COOL");
outtextxy(,,"^_^");
delay();
delay();
delay();
setcolor(BLACK);
settextstyle(0,0,4);
outtextxy(,,"COOL");
outtextxy(,,"^_^");
settextstyle(0,0,1);
if(score%3==0&&score!=0)
{
setcolor();
settextstyle(0,0,2);
outtextxy(,,"CONGRATULATION ON YOU ^_^");
sleep(2);
setcolor(BLACK);
settextstyle(0,0,2);
outtextxy(,,"CONGRATULATION ON YOU ^_^ ");
settextstyle(0,0,1);
}
for(k=1;k<=;k++) /* 对满了行进行消去
*/
{
setcolor(BLACK);
draw_little_block
(k+MAPXOFT,y+MAPYOFT,0,2);
}
for(j=y-1;j>=1;j--) /* 消去1行后 用上面的
累下来(并且调整色彩) */
for(k=1;k<=;k++)
{
board[k-1][j]=board[k-1][j-1];
if(board[k-1][j])
{
setcolor(BLACK);
draw_little_block
(k+MAPXOFT,j+MAPYOFT,0,2);
setcolor(WHITE);
draw_little_block
(k+MAPXOFT,j+1+MAPYOFT,1,color);
}
}
delay();
y++;
}
}
}
int check_block(int x,int y,int style) /* 验证能不能往下1
个位置累方块 */
{
int x1=x+MAPXOFT,y1=y+MAPYOFT;
int x2,y2,i;
for(i=0;i<=6;i+=2)
{
x2=x1+shapes[style].xy[ i];
y2=y1+shapes[style].xy[i+1];
if(x2>=&&x2<&&y2<&&(y2<6||board[x2-][y2-
6]==0))
continue;
else
break;
}
if(i==8)
return 1;
else
return 0;
getch();
}
我这里也是别人那里看来的。希望对你有用
电脑代码视频文件代码电脑文件类型代码
A. 怎么查寻网页上视频的源代码
方法一、在源代码中搜索视频格式为FLV、MP4等视频格式,可以找到视频文件的绝对路径或相对路径,将其复制到下载工具中就可以下载了。
方法二、有的视频在源代码中是直接找不到的,他们是通过播放器调用JS代码中的视频地址,这种情况就要找到被调用的JS代码,在JS代码里面就可以搜索到视频文件的地址。
方法三、还有一种情况是页面嵌入的另外一个视频播放页面,需要找到另外一个页面的源代码,在其中去搜索视频地址。
总之要根据实际情况去分析视频地址隐藏于何处,找到它就可以下载了。
源代码主要有以下2种作用:
生成目标代码,即计算机可以识别的代码。
对软件进行说明,即对软件的编写进行说明。
为数不少的初学者,甚至少数有经验的程序员都忽视软件说明的编写,因为这部分虽然不会在生成的程序中直接显示,也不参与编译。但是说明对软件的学习、分享、维护和软件复用都有巨大的好处。因此,书写软件说明在业界被认为是能创造优秀程序的良好习惯,一些公司也硬性规定必须书写。
(需要指出的是,源代码的修改不能改变已经生成的目标代码。如果需要目标代码做出相应的修改,必须重新编译。 )
版权
如果按照源代码类型区分软件,通常被分为两类:自由软件和非自由软件。自由软件一般是不仅可以免费得到,而且公开源代码;相对应地,非自由软件则是不公开源代码。所有一切通过非正常手段获得非自由软件源代码的行为都将被视为非法。
参考链接:网络_源代码 (示例源程序)
B. 电脑文件类型代码
Windows系统文件类型概览[推荐]
大家知道,Windows系统文件按照不同的格式和用途分很多种类,为便于管理和识别,在对文件命名时,是以扩展名加以区分的,即文件名格式为: "主文件名.扩展名"。这样就可以根据文件的扩展名,判定文件的种类,从而知道其格式和用途。例如:
"文件名1.DOC"的扩展名"DOC"表示本文件是一个"Microsoft Word 文档",
"文件名2.XLS"的扩展名"XLS"表示本文件是一个"Microsoft Excel 工作表",
"文件名3.BMP"的扩展名"BMP"表示本文件是一个"BMP格式图像",
"文件名4.MP3"的扩展名"MP3"表示本文件是一个"MP3 格式声音",
"文件名5.MPEG"的扩展名"MPEG"表示本文件是一个"**文件(MPEG)"。
下面列出Windows系统文件的扩展名及其分类对照表,以备查阅:
1. "" "H. Internet 电话技术"
2. "" "虚拟设备驱动程序"
3. "ACA" "Microsoft Agent Character File (HTTP format)"
4. "ACF" "Microsoft Agent Character File (HTTP format)"
5. "ACG" "Microsoft Agent 预览文件"
6. "ACL" "自动更正列表文件"
7. "ACS" "Microsoft Agent Character File"
8. "ACW" "辅助功能向导设置"
9. "ADE" "Microsoft Access 项目扩展"
. "ADN" "Microsoft Access 空白项目模板"
. "ADP" "Microsoft Access 项目"
. "AIF" "AIFF 格式声音"
. "AIFC" "AIFF 格式声音"
. "AIFF" "AIFF 格式声音"
. "ANI" "动画光标"
. "ASA" "活动服务器文档"
. "ASD" "ASF Stream Description File"
. "ASF" "Windows Media 音频/视频文件"
. "ASP" "活动服务器文档"
. "ASX" "Windows Media 音频/视频快捷方式"
. "AU" "AU 格式声音"
. "AUDIOCD" "AudioCD"
. "AVI" "视频剪辑"
. "AW" "应答向导文件"
. "BKF" "Windows 备份文件"
. "BLG" "性能监视器文件"
. "BMP" "BMP 图像"
. "CAT" "安全编录"
. "CDA" "CD 音频曲目"
. "CDF" "频道文件"
. "CDX" "活动服务器文档"
. "CER" "安全证书"
. "CHK" "还原了文件碎片"
. "CHM" "已编译的 HTML 帮助文件"
. "CLP" "剪贴板剪贴"
. "CNF" "快速拨号"
. "COL" "HTML 帮助文件"
. "CPL" "控制面板扩展"
. "CRL" "证书吊销列表"
. "CRT" "安全证书"
. "CSS" "级联样式表文档"
. "CSV" "Microsoft Excel 逗号分隔值文件"
. "CUR" "光标"
. "DB" "数据库文件"
. "DCS" "数据库内容源"
. "DER" "安全证书"
. "DESKLINK" "DESKLINK 文件"
. "DET" "Office Data File"
. "DIB" "BMP 图像"
. "DIC" "文本文档"
. "DIF" "Microsoft Excel 数据交换格式"
. "DOC" "Microsoft Word 文档"
. "DOCHTML" "Microsoft Word HTML 文档"
. "DOCMHTML" "DOCMHTML 文件"
. "DOT" "Microsoft Word 模板"
. "DOTHTML" "Microsoft Word HTML 模板"
. "DQY" "Microsoft Excel ODBC 查询文件"
. "DRV" "设备驱动程序"
. "DSN" "数据源名称"
. "DUN" "拨号网络文件"
. "DVD" "DVD"
. "ECS" "Exchange Server 内容源"
. "ELM" "Microsoft Office 主题文件"
. "EMF" "EMF 图像"
. "EML" "Outlook Express 邮件消息"
. "EXC" "文本文档"
. "FAD" "Office 数据文件"
. "FAV" "FAV 文件"
. "FCS" "文件共享内容源"
. "FFA" "文件检索索引"
. "FFL" "文件检索索引"
. "FFT" "文件检索索引"
. "FFX" "文件检索索引"
. "FON" "字体文件"
. "FPDOCLIB" "Microsoft FrontPage Document Library"
"FPHOMEOP" Microsoft FrontPage Home Page Open"
. "FPHOMEPG" "Microsoft FrontPage 主页"
. "FPHTML""Microsoft FrontPage HTML 文档"
. "FPLIST" "Microsoft FrontPage List"
. "FPNOPUB" "Microsoft FrontPage Dont Publish"
. "FPOPEN" "Microsoft FrontPage 打开文件"
. "FPSURVEY" "Microsoft FrontPage Survey"
. "FPWEB" "FPWEB 文件"
. "FRG" "FRG 文件"
. "GIF" "GIF 图像"
. "GRA" "Microsoft Graph 图表"
. "GRP" "Microsoft 程序组"
. "HLP" "帮助文件"
. "HOL" "Microsoft Outlook Holidays"
. "HT" "超级终端文件"
. "HTA" "HTML Application"
. "HTC" "HTC 文件"
. "HTM" "HTML Document"
. "HTML" "HTML Document"
. "HTT" "HyperText 模板"
. "HTX""用于 Internet 数据库的 HTML 模板"
. "ICC" "ICC 配置文件"
. "ICM" "ICC 配置文件"
. "ICO" "图标"
. "ICS" "iCalendar 文件"
. "IDC" "IDC 文件"
. "III" "Intel IPhone 兼容"
. "INF" "安装信息"
. "INI" "配置设置"
. "INS" "Internet 通讯设置"
. "IQY" "Microsoft Excel Web 查询文件"
. "ISP" "Internet 通讯设置"
. "ITS" "Internet Document Set"
. "ITSS" "Microsoft Infotech Storage System File"
. "IVF" "Indeo 视频文件"
. "JFIF" "JPEG 图像"
. "JOB" "任务对象"
. "JOD" "Microsoft.Jet.OLEDB.4.0"
. "JPE" "JPEG 图像"
. "JPEG" "JPEG 图像"
. "JPG" "JPEG 图像"
. "JS" "JScript Script File"
. "JSE" "JScript Encoded Script File"
. "LDB" "Microsoft Access 记录锁定信息"
. "LEX" "词典文件"
. "LOG" "文本文档"
"LWV" Microsoft Linguistically Enhanced Sound File"
. "M1V" "**文件(MPEG)"
. "M3U" "M3U 文件"
. "MAD" "Microsoft Access 模块快捷方式"
. "MAF" "Microsoft Access 窗体快捷方式"
. "MAG" "Microsoft Access 图表快捷方式"
. "MAM" "Microsoft Access 宏快捷方式"
. "MAPIMAIL" "MAPIMAIL 文件"
. "MAQ" "Microsoft Access 查询快捷方式"
. "MAR" "Microsoft Access 报表快捷方式"
. "MAS"Microsoft Access 存储过程快捷方式"
. "MAT" "Microsoft Access 表快捷方式"
. "MAU" "MAU 文件"
. "MAV" "Microsoft Access 视图快捷方式"
"MAW"Microsoft Access 数据访问页快捷方式"
. "MDA" "Microsoft Access 加载项"
. "MDB" "Microsoft Access 应用程序"
. "MDBHTML" "Microsoft Access HTML 文档"
. "MDE" "Microsoft Access MDE 数据库"
. "MDN""Microsoft Access 空白数据库模板"
. "MDT" "Microsoft Access 加载项数据"
. "MDW" "Microsoft Access 工作组信息"
. "MDZ""Microsoft Access 数据库向导模板"
. "MGC" "媒体目录文件"
. "MHT" "MHTML Document"
. "MHTML" "MHTML Document"
. "MID" "MIDI 序列"
. "MIDI" "MIDI 序列"
. "MML" "媒体目录文件"
. "MMM" "媒体剪辑"
. "MMW" "媒体目录文件"
. "MP2" "**文件(MPEG)"
. "MP2V" "**文件(MPEG)"
. "MP3" "MP3 格式声音"
. "MPA" "**文件(MPEG)"
. "MPE" "**文件(MPEG)"
. "MPEG" "**文件(MPEG)"
. "MPF" "Media Package 文件"
. "MPG" "**文件(MPEG)"
. "MPV2" "**文件(MPEG)"
. "MSC" "Microsoft 通用管理文档"
. "MSG" "Outlook 项目"
. "MSI" "Windows Installer 软件包"
. "MSP" "Windows Installer 修补程序"
. "MSRCINCIDENT" "Microsoft 远程访问事件"
. "MSSTYLES" "Windows 可视化风格文件"
. "MSWMM" "Windows Movie Maker 项目"
. "NCS" "Lotus Notes 内容源"
. "NFO" "MSInfo 文档"
. "NICK" "Office 数据文件"
. "NK2" "Office 数据文件"
."NMW""Microsoft NetMeeting T 兼容白板文档"
. "NWS" "Outlook Express 新闻消息"
. "OBD" "OBD 文件"
. "OBT" "OBT 文件"
. "OBZ" "OBZ 文件"
. "OCX" "ActiveX 控件"
. "ODC" "Microsoft Office 数据连接"
. "ODCCUBEFILE" "ODCCUBEFILE 文件"
. "ODCDATABASEFILE" "ODCDATABASEFILE 文件"
. "ODCNEWFILE" "ODCNEWFILE 文件"
. "ODCTABLEFILE" "ODCTABLEFILE 文件"
. "OFT" "Outlook 项目模板"
. "OPC" "Microsoft 清理向导文件"
. "OPS" "Office 设置文件"
. "OQY" "Microsoft Excel OLAP 查询文件"
. "OSS" "Office 搜索"
. "OST" "Office 数据文件"
. "OTF" "OpenType 字体文件"
. "P" "证书申请"
. "P" "Personal Information Exchange"
. "P7B" "PKCS #7 证书"
. "P7C" "数字标识文件"
. "P7M" "PKCS #7 MIME 消息"
. "P7R" "PKCS #7 证书"
. "P7S" "PKCS #7 签名"
. "PAB" "Office 数据文件"
. "PBK" "拨号电话簿"
. "PCB" "PCB 文件"
. "PCD" "Photo CD 图像"
. "PCX" "PCX 图像"
. "PFM" "Type 1 字体文件"
. "PFX" "Personal Information Exchange"
. "PIP" "Microsoft Office 设置文件"
. "PKO" "公钥安全对象"
. "PMA" "性能监视器文件"
. "PMC" "性能监视器文件"
. "PML" "性能监视器文件"
. "PMR" "性能监视器文件"
. "PMW" "性能监视器文件"
. "PNG" "PNG 图像"
. "POT" "Microsoft PowerPoint 模板"
. "POTHTML" "Microsoft PowerPoint HTML 模板"
. "PPA" "Microsoft PowerPoint 加载项"
. "PPS" "Microsoft PowerPoint 幻灯片放映"
. "PPT" "Microsoft PowerPoint 演示文稿"
. "PPTHTML" "Microsoft PowerPoint HTML 文档"
. "PPTMHTML" "PPTMHTML 文件"
. "PRF" "msrating.dll,-"
. "PST" "Office 数据文件"
. "PSW" "Password Backup"
. "PWZ" "Microsoft PowerPoint 向导"
. "QDS" "目录查询"
. "RAT" "msrating.dll,-"
. "RDP" "远程桌面连接"
. "REG" "注册表项"
. "RMI" "MIDI 序列"
. "RNK" "拨号快捷方式"
. "RQY" "Microsoft Excel OLE DB 查询文件"
. "RTF" "RTF 格式"
. "RWZ" "Office 数据文件"
. "SC2" "Microsoft Schele+ 应用程序"
. "SCD" "Microsoft Schele+ 应用程序"
. "SCH" "Microsoft Schele+ 应用程序"
. "SCP" "文本文档"
. "SCT" "Windows Script Component"
. "SDB" "Appfix 软件包"
. "SHB" "将快捷方式插入到文档"
. "SHS" "片段对象"
. "SHTM" "HTML Document"
. "SHTML" "HTML Document"
. "SLK" "Microsoft Excel SLK 数据导入格式"
. "SLL" "SLL 文件"
. "SND" "AU 格式声音"
. "SNP" "Snapshot 文件"
. "SPC" "PKCS #7 证书"
. "SPL" "Shockwave Flash Object"
. "SST" "Microsoft 系列证书存储"
. "STF" "Microsoft 安装文件"
. "STL" "证书信任列表"
. "STM" "HTML Document"
. "SWF" "Shockwave Flash Object"
. "SYS" "系统文件"
. "TCS" "Tahoe Server 内容源"
. "THEME" "Windows 主题文件"
. "TIF" "TIF 图像"
. "TIFF" "TIF 图像"
. "TTC" "TrueType Collection 字体文件"
. "TTF" "TrueType 字体文件"
. "TXT" "文本文档"
. "UDL" "Microsoft 数据链接"
. "ULS" "Internet 定位服务"
. "URL" "Internet 快捷方式"
. "VBE" "VBScript Encoded Script File"
. "VBS" "VBScript Script File"
. "VCF" "vCard 文件"
. "VCS" "vCalendar 文件"
. "VXD" "虚拟设备驱动程序"
. "WAB" "数字标识文件"
. "WAV" "波形声音"
. "WAX" "Windows Media 音频快捷方式"
. "WBK" "Microsoft Word 备份文档"
. "WCS" "Web 站点内容源"
. "WEB" "Office 数据文件"
. "WEBPNP" "Webpnp"
. "WHT" "Microsoft NetMeeting 旧白板文档"
. "WIZ" "Microsoft Word 向导"
. "WIZHTML" "Microsoft Access HTML 模板"
. "WLL" "WLL 文件"
. "WM" "Windows Media 音频/视频文件"
. "WMA" "Windows Media 音频文件"
. "WMD" "Windows Media Player 下载软件包"
. "WMF" "WMF 图像"
. "WMP" "Windows Media Player 文件"
. "WMS" "Windows Media Player 外观文件"
. "WMV" "Windows Media 音频/视频文件"
. "WMX" "Windows Media 音频/视频快捷方式"
. "WMZ" "Windows Media Player 外观程序包"
. "WPS" "WPS 文件"
. "WRI" "写入文档"
. "WSC" "Windows Script Component"
. "WSF" "Windows Script File"
. "WSH" "Windows Script Host Settings File"
. "WTX" "文本文档"
. "WVX" "Windows Media 音频/视频快捷方式"
. "XLA" "Microsoft Excel 加载宏"
. "XLB" "Microsoft Excel 工作表"
. "XLC" "Microsoft Excel 图表"
. "XLD" "Microsoft Excel 5.0 对话框编辑表"
. "XLK" "Microsoft Excel 备份文件"
. "XLL" "Microsoft Excel XLL 加载宏"
. "XLM" "Microsoft Excel 4.0 宏"
. "XLS" "Microsoft Excel 工作表"
. "XLSHTML" "Microsoft Excel HTML 文档"
. "XLSMHTML" "XLSMHTML 文件"
. "XLT" "Microsoft Excel 模板"
. "XLTHTML" "Microsoft Excel HTML 模板"
. "XLV" "Microsoft Excel VBA 模块"
. "XLW" "Microsoft Excel 工作区"
. "XML" "XML 文档"
. "XNK" "Exchange 快捷方式"
. "XSL" "XSL 样式表"
. "ZAP" "软件安装设置"
. "ZIP" "压缩(zipped)文件夹"
pascalè¯è¨
ä½ å¥½ãfree pascalå¨è¿ç®æ¶ï¼å¸¸æexited with exitcode=*** çæ åµï¼æææ¯ä½ çç¨åºåå¨æç§é误ï¼é误类åä¸åºå·å¯¹åºãæç»ä½ ææçé误åå·ï¼ä»¥åèªå·±å¯¹åºçæ¥å°±è¡ã
ascalè¿è¡éè¯¯å¯¹ç §è¡¨
è¿è¡é误æ¯æç¨åºè¿è¡æ¶åºç°çé误ï¼å½åçæ¶ï¼Turbo Pascalæ¾ç¤ºå¦ä¸ä¿¡æ¯ï¼
RUNTIME ERROR NNNN AT XXXXï¼YYYY
å ¶ä¸ï¼nnnnæ¯è¿è¡é误代ç ï¼xxxxæ¯é误åççç¨åºæ®µï¼yyyyæ¯é误å°åå移ã
DOS é误代ç ï¼
1æ æDoSåè½å·
2æ件æ«æ¾å°
3è·¯å¾æªæ¾å°
4æå¼æ件è¿å¤
5ç¦æ¢æ件åå
6æ ææ件å¥æ
æ ææ件åå代ç
æ æ驱å¨å¨å·
ä¸è½å é¤å½åæ¥å½
ä¸è½è·¨é©±å¨å¨æ¹æ件å
I/Oé误
ç£ç读é误
ç£çåé误
æ件åéæ«èµå¼
æ件æªæå¼
æ件æªç¨è¾å ¥æ¹å¼æå¼
æ件æ«ç¨è¾åºæ¹å¼æå¼
æ ææ°åæ ¼å¼
严éé误
ç£çåä¿æ¤
læªç¥åå
驱å¨å¨æªåå¤å¥½
æªç¥å½ä»¤
æ°æ®CRCæ ¡éªé
驱å¨å¨è¯·æ±çç»æé¿åº¦é
ç£çå®ä½é
æªç¥åªä»ç±»å
æåºæ«æ¾å°
æå°æºç¼ºçº¸
设å¤å失败
设å¤è¯»å¤±è´¥
硬件æ é
è´å½é误
被é¶é¤
lèå´æ£æ¥é
å æ 溢åºé
å 溢åºé
æ ææéæä½
æµ®ç¹ä¸æº¢åº
æµ®ç¹ä¸æº¢åº
æ ææµ®ç¹è¿ç®
æªå®è£ è¦ç管çç¨åº
è¦çæ件读é
对象æªåå§å
2llè°ç¨æ½è±¡æ¹æ³
æµç»è®¡é
éåä¸æ è¶ç
éå溢åº
ç®æ¯ä¸æº¢é误
ååéæ³
æ§å¶-C
æææ令
æ æçTYPECAST
æ æçåä½TYPECAST
æ æçåä½æä½
没æåä½æ¹æ³è°ç¨DISPATCHER
ä¸è½å»ºç«åä½æ°ç»
åä½ä¸å å«æ°ç»
åä½æ°ç»è¾¹çé误
TLSåå§åé误
Pascalç¼è¯éè¯¯å¯¹ç §è¡¨
ä¸é¢ååºå¨ç¼è¯ç¨åºæ¶å¯è½åºç°çé误ï¼å¨éæç¯å¢ä¸ï¼Turbo Pascalå°èªå¨å è½½æºç¨åºå¹¶å®ä½äºåºéå¤ã
lå å溢åº
2缺æ è¯ç¬¦
3æ è¯ç¬¦æªå®ä¹
4æ è¯ç¬¦éå®ä¹
5è¯æ³é误
6å®å常éé
7æ´å常éé
8å符串常éè·¨è¡
9æ件åµå¥è¿å¤
éæ£å¸¸æ件ç»æ
è¡è¿é¿
缺类åæ è¯ç¬¦
æå¼æ件è¿å¤
æ ææ件å
æ件æªæ¾å°
ç£ç满
æ æç¼è¯æ示
æ件è¿å¤
æéå®ä¹ä¸æªå®ä¹ç±»å
缺åéæ è¯ç¬¦
ç±»åé误
ç»æè¿é¿
æ件åéä¸è½ä¸ºæ件
æ æå符串é¿åº¦
ç±»åä¸å¹é
æ æåçåºç±»å
ä¸ç大äºä¸ç
缺æåºç±»å
缺æ´å常æ°
缺常æ°
缺æ´åæå®å常æ°
缺æéç±»åæ è¯ç¬¦
æ æçå½æ°ç»æç±»å
缺æ å·æ è¯ç¬¦
缺BEGIN
缺END
缺æ´å表达å¼
缺æåºè¡¨è¾¾å¼
缺å¸å°è¡¨è¾¾å¼
æä½æ°ç±»åä¸æä½ç¬¦ä¸å¹é
表达å¼é
éæ³èµå¼
缺å段æ è¯ç¬¦
ç®æ æ件è¿é¿
æªå®ä¹å¤é¨æ è¯ç¬¦
æ æ*.OBJæ件记å½
代ç 段è¿é¿
æ°æ®æ®µè¿é¿
缺DO
æ æPUBLICå®ä¹
æ æEXTRNå®ä¹
EXTRNå®ä¹è¿å¤
缺0F
缺INTERFACE
æ æéå®ä½å¼ç¨
缺THEN
缺T0æDOWNTO
æªå®ä¹çååå¼ç¨
è¿ç¨è¿å¤
æ æç±»å转æ¢
被é¶é¤D
æ ææ件类å
ä¸è½è¯»å该类åçåé
缺æéåé
缺å符串åé
缺å符串表达å¼
åå 循ç¯å¼ç¨
åå åä¸å¹é
åå çæ¬ä¸å¹é
åå éå
åå æä»¶æ ¼å¼é误
缺IMPLEMENTATl0N
常æ°ä¸CASEç±»åä¸ç¸å¹é
缺记å½åé
常æ°è¶ç
缺æ件åé
缺æéåé
缺æ´åæå®å表达å¼
æ å·ä¸å¨å½ååä¸
æ å·å·²å®ä¹
æ å·æªå®ä¹
æ æåæ°
缺UNIT
缺âï¼â
缺âï¼â
缺âï¼â
缺â(â
缺â)â
缺âï¼â
缺âï¼ï¼â
缺â[âæâ(ï¼â
缺â]âæâï¼)â
缺âï¼â
åéè¿å¤
æ æFORæ§å¶åé
缺æ´ååé
æ¤å¤ä¸å 许ç¨æ件å
å符串é¿åº¦ä¸å¹é
æ æå顺åº
缺å符串常æ°
缺æ´åæå®ååé
缺æåºåé
INLINEé
缺å符表达å¼
éå®ä½é¡¹è¿å¤
CASE常éè¶ç
è¯å¥é
ä¸è½è°ç¨ä¸æè¿ç¨
å¿ é¡»å¨æ¹å¼ä¸ç¼è¯
æ«æ¾å°ç®æ å°å
æ¤å¤ä¸å 许å å«æ件
缺NIL
æ æéå®ç¬¦
æ æåéå¼ç¨
符å·è¿å¤
è¯å¥é¨åè¿é¿
æä»¶å¿ é¡»ä¸ºåéåæ°
æ¡ä»¶ç¬¦å·è¿å¤
æ¡ä»¶æ令éä½
åå§æ¡ä»¶å®ä¹é
lè¿ç¨åå½æ°å¤´ä¸åé¢å®ä¹çä¸å¹é
严éç£çé误
ä¸è½è®¡ç®è¯¥è¡¨è¾¾å¼
表达å¼é误ç»æ
læ ææ ¼å¼è¯´æ符
æ æé´æ¥å¼ç¨
æ¤å¤ä¸å 许ç»æåé
æ SYSTEMåå ä¸è½è®¡ç®
lä¸è½åå该符å·
æ ææµ®ç¹è¿ç®
ä¸è½å°è¦çç¼è¯è³å å
缺è¿ç¨åå½æ°åé
æ æè¿ç¨æå½æ°å¼ç¨
ä¸è½è¦ç该åå
缺对象类å
ä¸å 许å±é¨å¯¹è±¡ç±»å
缺VIRTUAL
缺æ¹æ³æ è¯ç¬¦
ä¸å 许èææé æ¹æ³
缺æé æ¹æ³æ è¯ç¬¦
缺éæ¾æ¹æ³æ è¯ç¬¦
FAILåªå 许å¨æé æ¹æ³å 使ç¨
æ æçæä½ç¬¦åæä½æ°ç»å
缺å åå¼ç¨
lä¸è½å åå¯éå®ä½ç¬¦å·
æ æå¯åå¨ç»å
æªæ¿æ´»ï¼æ令
æ æ符å·å¼ç¨
代ç çæé
缺ASM
字符设备中的几个函数分析
1.在内核中, dev_t 类型(在 <linux/types.h>中定义)用来持有设备编号 — 主次部分都包括.其中dev_t 是 位的量, 位用作主编号, 位用作次编号
1 #ifndef _LINUX_TYPES_H
2 #define _LINUX_TYPES_H
3
4 #include <asm/types.h>
5
6 #ifndef __ASSEMBLY__
7 #ifdef __KERNEL__
8
9 #define DECLARE_BITMAP(name,bits) /
unsigned long name[BITS_TO_LONGS(bits)]
#endif
#include <linux/posix_types.h>
#ifdef __KERNEL__
typedef __u __kernel_dev_t;
typedef __kernel_fd_set fd_set;
typedef __kernel_dev_t dev_t; //用来持有设备编号的主次部分
typedef __kernel_ino_t ino_t;
typedef __kernel_mode_t mode_t;
...
2.在 <linux/kdev_t.h>中的一套宏定义. 为获得一个 dev_t 的主或者次编号, 使用:
2.1设备编号的内部表示
MAJOR(dev_t dev);
MINOR(dev_t dev);
2.在有主次编号时, 需要将其转换为一个 dev_t, 可使用:
MKDEV(int major, int minor);
在linux/kdev_t.h中有下了内容
...
4 #define MINORBITS
5 #define MINORMASK ((1U << MINORBITS) - 1)
6
7 #define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
8 #define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
9 #define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))//高为表示主设备号,低位表示次设备号
...
3.分配和释放设备编号register_chrdev_region函数
下面摘自文件fs/char_dev.c内核源代码
/
*** register_chrdev_region() - register a range of device numbers
* @from: the first in the desired range of device numbers; must include
* the major number.
* @count: the number of consecutive device numbers required
* @name: the name of the device or driver.
*
* Return value is zero on success, a negative error code on failure.
*/
int register_chrdev_region(dev_t from, unsigned count, const char *name)
{
struct char_device_struct *cd;
dev_t to = from + count; //计算分配号范围中的最大值+=
dev_t n, next;
for (n = from; n < to; n = next) { /*每次申请个设备号*/
next = MKDEV(MAJOR(n)+1, 0);/*主设备号加一得到的设备号,次设备号为0*/
if (next > to)
next = to;
cd = __register_chrdev_region(MAJOR(n), MINOR(n),
next - n, name);
if (IS_ERR(cd))
goto fail;
}
return 0;
fail:/*当一次分配失败的时候,释放所有已经分配到地设备号*/
to = n;
for (n = from; n < to; n = next) {
next = MKDEV(MAJOR(n)+1, 0);
kfree(__unregister_chrdev_region(MAJOR(n), MINOR(n), next - n));
}
return PTR_ERR(cd);
}
这里, from是要分配的起始设备编号. from 的次编号部分常常是 0, 但是没有要求是那个效果. count是你请求的连续设备编号的总数. 注意, 如果count 太大, 要求的范围可能溢出到下一个次编号;但是只要要求的编号范围可用, 一切都仍然会正确工作. 最后, name 是应当连接到这个编号范围的设备的名子; 它会出现在 /proc/devices 和 sysfs 中.如同大部分内核函数, 如果分配成功进行, register_chrdev_region 的返回值是 0. 出错的情况下, 返回一个负的错误码, 不能存取请求的区域.
4.下面是char_device_struct结构体的信息
fs/char_dev.c
static struct char_device_struct {
struct char_device_struct *next; // 指向散列冲突链表中的下一个元素的指针
unsigned int major; // 主设备号
unsigned int baseminor; // 起始次设备号
int minorct; // 设备编号的范围大小
const char *name; // 处理该设备编号范围内的设备驱动的名称
struct file_operations *fops; // 没有使用
struct cdev *cdev; /* will die指向字符设备驱动程序描述符的指针*/
} *chrdevs[MAX_PROBE_HASH];
/
** Register a single major with a specified minor range.
*
* If major == 0 this functions will dynamically allocate a major and return
* its number.
*
* If major > 0 this function will attempt to reserve the passed range of
* minors and will return zero on success.
*
* Returns a -ve errno on failure.
*/
/
*** 该函数主要是注册注册注册主设备号和次设备号
* major == 0此函数动态分配主设备号
* major > 0 则是申请分配指定的主设备号
* 返回0表示申请成功,返 回负数说明申请失败
*/
static struct char_device_struct
*__register_chrdev_region(unsigned int major, unsigned int baseminor,
int minorct, const char *name)
{ /*以下处理char_device_struct变量的初始化和注册*/
struct char_device_struct *cd, **cp;
int ret = 0;
int i;
//kzalloc()分配内存并且全部初始化为0,
cd = kzalloc(sizeof(struct char_device_struct), GFP_KERNEL);
if (cd == NULL)
//ENOMEM定义在include/asm-generic/error-base.h中,
// #define ENOMEM /* Out of memory */
return ERR_PTR(-ENOMEM);
mutex_lock(&chrdevs_lock);
/* temporary */
if (major == 0) { //下面动态申请主设备号
for (i = ARRAY_SIZE(chrdevs)-1; i > 0; i—) {
//ARRAY_SIZE是定义为ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
//#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
if (chrdevs[i] == NULL)
//chrdevs是内核中已经注册了的设备好设备的一个数组
break;
}
if (i == 0) {
ret = -EBUSY;
goto out;
}
major = i;
ret = major;//这里得到一个位使用的设备号
}
//下面四句是对已经申请到的设备数据结构进行填充
cd->major = major;
cd->baseminor = baseminor;
cd->minorct = minorct;/*申请设备号的个数*/
strlcpy(cd->name, name, sizeof(cd->name));
/*以下部分将char_device_struct变量注册到内核*/
i = major_to_index(major);
for (cp = &chrdevs[i]; *cp; cp = &(*cp)->next)
if ((*cp)->major > major || //chardevs[i]设备号大于主设备号
((*cp)->major == major &&
(((*cp)->baseminor >= baseminor) || //chardevs[i]主设备号等于主设备号,并且此设备号大于baseminor
((*cp)->baseminor + (*cp)->minorct > baseminor))))
break;
//在字符设备数组中找到现在注册的设备
/* Check for overlapping minor ranges. */
if (*cp && (*cp)->major == major) {
int old_min = (*cp)->baseminor;
int old_max = (*cp)->baseminor + (*cp)->minorct - 1;
int new_min = baseminor;
int new_max = baseminor + minorct - 1;
/* New driver overlaps from the left. */
if (new_max >= old_min && new_max <= old_max) {
ret = -EBUSY;
goto out;
}
/* New driver overlaps from the right. */
if (new_min <= old_max && new_min >= old_min) {
ret = -EBUSY;
goto out;
}
}
/*所申请的设备好号能够满足*/
cd->next = *cp;/*按照主设备号从小到大顺序排列*/
*cp = cd;
mutex_unlock(&chrdevs_lock);
return cd;
out:
mutex_unlock(&chrdevs_lock);
kfree(cd);
return ERR_PTR(ret);
}
以上程序大体上分为两个步骤:
1.char_device_struct类型变量的分配以及初始化~行
2.将char_device_struct变量注册到内核,行页到行
1.char_device_struct类型变量的分配以及初始化
(1)首先,调用 kmalloc 分配一个 char_device_struct 变量cd。
检查返回值,进行错误处理。
(2)将分配的char_device_struct变量的内存区清零memset。
(3)获取chrdevs_lock读写锁,并且关闭中断,禁止内核抢占,write_lock_irq。
(4)如果传入的主设备号major不为0,跳转到第(7)步。
(5)这时,major为0,首先需要分配一个合适的主设备号。
将 i 赋值成 ARRAY_SIZE(chrdevs)-1,其中的 chrdevs 是包含有个char_device_struct *类型的数组,
然后递减 i 的值,直到在chrdevs数组中出现 NULL。当chrdevs数组中不存在空值的时候,
ret = -EBUSY; goto out;
(6)到达这里,就表明主设备号major已经有合法的值了,接着进行char_device_struct变量的初始化。
设置major, baseminor, minorct以及name。
2.将char_device_struct变量注册到内核
(7)将 i 赋值成 major_to_index(major)
将major对取余数,得到可以存放char_device_struct在chrdevs中的索引
(8)进入循环,在chrdevs[i]的链表中找到一个合适位置。
退出循环的条件:
(1)chrdevs[i]为空。
(2)chrdevs[i]的主设备号大于major。
(3)chrdevs[i]的主设备号等于major,但是次设备号大于等于baseminor。
注意:cp = &(*cp)->next,cp是char_device_struct **类型,(*cp)->next是一个char_device_struct
*类型,所以&(*cp)->next,就得到一个char_device_struct **,并且这时候由于是指针,所以
对cp赋值,就相当于对链表中的元素的next字段进行操作。
(9)进行冲突检查,因为退出循环的情况可能造成设备号冲突(产生交集)。
如果*cp不空,并且*cp的major与要申请的major相同,此时,如果(*cp)->baseminor < baseminor + minorct,
就会发生冲突,因为和已经分配了的设备号冲突了。出错就跳转到ret = -EBUSY; goto out;
()到这里,内核可以满足设备号的申请,将cd链接到链表中。
()释放chrdevs_lock读写锁,开中断,开内核抢占。
()返回加入链表的char_device_struct变量cd。
()out出错退出
a.释放chrdevs_lock读写锁,开中断,开内核抢占。
b.释放char_device_struct变量cd,kfree。
c.返回错误信息
下面程序出自fs/char_dev.c
动态申请设备号
...
/
*** alloc_chrdev_region() - register a range of char device numbers
* @dev: output parameter for first assigned number
* @baseminor: first of the requested range of minor numbers
* @count: the number of minor numbers required
* @name: the name of the associated device or driver
*
* Allocates a range of char device numbers. The major number will be
* chosen dynamically, and returned (along with the first minor number)
* in @dev. Returns zero or a negative error code.
*/
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count,
const char *name)
{
/* dev:
仅仅作为输出参数,成功分配后将保存已分配的第一个设备编号。
baseminor:
被请求的第一个次设备号,通常是0。
count:
所要分配的设备号的个数。
name:
和所分配的设备号范围相对应的设备名称。
b.返回值:
成功返回0,失败返回负的错误编码
*/
struct char_device_struct *cd;
cd = __register_chrdev_region(0, baseminor, count, name);
if (IS_ERR(cd))
return PTR_ERR(cd);
*dev = MKDEV(cd->major, cd->baseminor);
return 0;
}
...
如何用css js制作计算器?
源代码如下:
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>js加减乘除计算器代码</title>
<style>
body,ul{ margin:0px; padding:0px;}
body{ background:#AF}
li{ list-style:none;}
.fl{ float:left;}
.fr{ float:right;}
.clearfix:after{ content:""; display:block;clear:both}
.clearfix{ zoom:1;}
/*是用inset可以将外部阴影改成内部阴影;若要实现内外阴影同时存在,将其并在一行用逗号隔开*/
.calBox{ width:px; padding-bottom:px;background:#FDFDFD; border-radius:5px; position:absolute; left:%; top:%; margin-left:-px; margin-top:-px; box-shadow:0px 0px px rgba(0,0,0,0.8),0px 0px px rgba(0,0,0,0.5) inset; -webkit-box-shadow:0px 0px px rgba(0,0,0,0.8),0px 0px px rgba(0,0,0,0.5) inset; background:#F9F9F9; overflow:hidden}
input{ width:px; height:px; margin:px 7px 0px; border-radius:5px; border:1px solid #F; box-shadow:0px 5px 2px rgba(,,,0.8) inset; -webkit-box-shadow:0px 5px 2px rgba(,,,0.8) inset; outline:none; background:#FCFDEB; text-align:right; font-family:"微软雅黑"; font-size:px; padding:0px px;}
ul{ }
li{ list-style:none; width:px; height:px; line-height:px; text-align:center; font-family:"微软雅黑"; border:1px solid #8B8B8B; border-radius:5px; background:url(/jscss/demoimg//calBg) repeat-x; float:left; margin:px 6px 0px;}
.one li{ height:px; background:url(/jscss/demoimg//calBg1.jpg) repeat-x; line-height:px;cursor:pointer;}
.one .orange{ background:url(/jscss/demoimg//calBg2.jpg) repeat-x; border:1px solid #;}
.one .black{ background:url(/jscss/demoimg//calBg3.jpg) repeat-x; border:1px solid #; color:#fff;}
.one .gray{ background:url(/jscss/demoimg//calBg4.jpg) repeat-x; border:1px solid #5F;}
.zero{ width:px;}
.one .deng{ background:url(/jscss/demoimg//calBg5.jpg); height:px;}
.twoBox{ width:px; overflow:hidden; }
.two{ width:px;}
.calBox .three { margin:0px}
.calu{ padding:0px px; width:px;}
</style>
<script type="text/javascript">
function findArr(a,c){ for(var b=0;b<a.length;b++){ if(a[b]==c){ return true}}return false}function getClass(d,f){ if(document.getElementsByClassName){ return d.getElementsByClassName(f)}else{ var a=[];var e=document.getElementsByTagName("*");for(var c=0;c<e.length;c++){ var b=e[c].className.split(" ");if(findArr(b,f)){ a.push(e[c])}}return a}};
window.onload=function()
{
var aNum=getClass(document,'num');
var oText=document.getElementById('text');
var aPer=getClass(document,'oper');
var oPer=document.getElementById('per');
var oText1=document.getElementById('text1');
var oDeng=getClass(document,'deng')[0];
var oSq=getClass(document,'sq')[0];
var oRec=getClass(document,'rec')[0];
var oZheng=getClass(document,'zheng')[0];
var oOn=getClass(document,'on')[0];
var oOff=getClass(document,'off')[0];
var oClea=getClass(document,'clea')[0];
var bOnOrOffClick=false;
function fnNum(a)
{
var bClear=false;
oText.value='0'
for(var i=0;i<aNum.length;i++)
{
aNum[i].onclick=function()
{
if(!bOnOrOffClick)return;
if(bClear)
{
bClear=false;
}
if(oText.value.indexOf('.')!=-1)
{
if(this.innerHTML=='.')
{
return;
}
}
if(oPer.value&&oText.value&&oText1.value=='')
{
oText1.value=oText.value;
oText.value='';
}
var re=/^0\.{ 1}\d+$/;
var re1=/^([0]\d+)$/;
oText.value+=this.innerHTML;
if(re.test(oText.value))
{
return;
}
if(re1.test(oText.value))
{
oText.value=this.innerHTML;
}
}
//符号部分的添加
for(var j=0;j<aPer.length;j++)
{
aPer[j].onclick=function()
{
if(oText.value&&oPer.value&&oText1.value)
{
var n=eval(oText1.value+oPer.value+oText.value);
oText.value=n;
oText1.value='';
}
oPer.value=this.innerHTML;
}
}
//点击等号的时候
oDeng.onclick=function()
{
//+-*/%的情况
if(oText1.value==''&&oPer.value==''&&oText.value=='')
{
return;
}
var n=eval(oText1.value+oPer.value+oText.value);
oText.value=n;
oText1.value='';
oPer.value='';
bClear=true;
}
//点击开根号的时候
oSq.onclick=function()
{
var m=Math.sqrt(oText.value);
oText.value=m;
}
//点击倒数的时候
oRec.onclick=function()
{
var a=1/oText.value;
if(oText.value=='0')
{
a='正无穷'
}
oText.value=a;
}
//正负号的时候
oZheng.onclick=function()
{
if(oText.value>0)
{
oText.value=-oText.value;
}
else
{
oText.value =-oText.value;
}
}
//清屏的时候
oClea.onclick=function()
{
oText.value='0';
oText1.value='';
oPer.value='';
}
}
}
//on时
oOn.onclick=function()
{
bOnOrOffClick=true;
fnNum(bOnOrOffClick);
}
//off时
oOff.onclick=function()
{
bOnOrOffClick=false;
fnNum(bOnOrOffClick);
oText.value='';
}
}
</script>
</head>
<body>
<div class="calBox">
<div class="calu">
<input type="text" id="text">
<ul class="one clearfix">
<li class="orange on">开机</li>
<li class="orange off">关机</li>
<li class="orange clea">清屏</li>
<li class="black zheng">+/-</li>
<li class="black rec">1/x</li>
<li class="num">7</li>
<li class="num">8</li>
<li class="num">9</li>
<li class="gray oper">/</li>
<li class="black oper">%</li>
<li class="num">4</li>
<li class="num">5</li>
<li class="num">6</li>
<li class="gray oper">*</li>
<li class="black sq">√</li>
<!-- -->
</ul>
<div class="clearfix">
<div class="twoBox fl">
<ul class="one fl two">
<li class="num">1</li>
<li class="num">2</li>
<li class="num">3</li>
<li class="gray oper">-</li>
<li class="zero num">0</li>
<li class="num">.</li>
<li class="gray oper">+</li>
</ul>
</div>
<ul class="one three clearfix fl">
<li class="black deng fl">=</li>
</ul>
</div>
</div>
</div>
<input type="text" id="per" style="display:none">
<input type="text" id="text1" style="display:none">
<div style="text-align:center;clear:both">
</div>
</body>
</html>