1.HTML如何实现单击按钮后显示隐藏表格

2.lt;table>标签中的标签出现挤压现象怎么解决

3.thinkphp5怎么跨数据库查询

4.求cad常用命令

5.2021-06-28 Rstdio中DESeq2相关软件的安装

6.如何从uboot读取mac,然户传递到内核中

_tablet p

路由器的基本功能如下:

第一,网络互连:路由器支持各种局域网和广域网接口,主要用于互连局域网和广域网,实现不同网络互相通信;

第二,数据处理:提供包括分组过滤、分组转发、优先级、复用、加密、压缩和防火墙等功能;

第三,网络管理:路由器提供包括路由器配置管理、性能管理、容错管理和流量控制等功能。

路由器是互联网络中必不可少的网络设备之一,路由器是一种连接多个网络或网段的网络设备,它能将不同网络或网段之间的数据信息进行“翻译”,以使它们能够相互“读”懂对方的数据,从而构成一个更大的网络。 路由器有两大典型功能,即数据通道功能和控制功能。数据通道功能包括转发决定、背板转发以及输出链路调度等,一般由特定的硬件来完成;控制功能一般用软件来实现,包括与相邻路由器之间的信息交换、系统配置、系统管理等。

要解释路由器的概念,首先要介绍什么是路由。所谓“路由”,是指把数据从一个地方传送到另一个地方的行为和动作,而路由器,正是执行这种行为动作的机器,英文名称Router。

HTML如何实现单击按钮后显示隐藏表格

在做插入数据操作时,提示错误信息:插入错误: 列名或所提供值的数目与表定义不匹配。

数据库表中有三个个字段:id,name,pwd,执行的SQL语句如下:

string sql = "insert into [User]? values('"+name+"','"+pwd+" ')"; //name,pwd 为变量

SQL语句没有错误,经过查找,发现是ID设置错误,一般ID是自增的,设置标识符。所以,只要设置ID就可以了。

扩展资料:

结构化查询语言包含6个部分:

一:数据查询语言(DQL:Data Query Language):

其语句,也称为“数据检索语句”,用以从表中获得数据,确定数据怎样在应用程序给出。保留字SELECT是DQL(也是所有SQL)用得最多的动词,其他DQL常用的保留字有WHERE,ORDER BY,GROUP BY和HAVING。这些DQL保留字常与其他类型的SQL语句一起使用。

二:数据操作语言(DML:Data Manipulation Language):其语句包括动词INSERT,UPDATE和DELETE。它们分别用于添加,修改和删除表中的行。也称为动作查询语言。

三:事务处理语言(TPL):它的语句能确保被DML语句影响的表的所有行及时得以更新。TPL语句包括BEGIN TRANSACTION,COMMIT和ROLLBACK。

四:数据控制语言(DCL):它的语句通过GRANT或REVOKE获得许可,确定单个用户和用户组对数据库对象的访问。某些RDBMS可用GRANT或REVOKE控制对表单个列的访问。

五:数据定义语言(DDL):

其语句包括动词CREATE和DROP。在数据库中创建新表或删除表(CREAT TABLE 或 DROP TABLE);为表加入索引等。DDL包括许多与人数据库目录中获得数据有关的保留字。它也是动作查询的一部分。

六:指针控制语言(CCL):它的语句,像DECLARE CURSOR,FETCH INTO和UPDATE WHERE CURRENT用于对一个或多个表单独行的操作。

参考资料:百度百科-sql

lt;table>标签中的<td>标签出现挤压现象怎么解决

HTML如何实现单击按钮后显示隐藏表格 <>

<head>

<title>利用Dom属性来创建表格</title>

<script type=text/jascript>

function toggle(id){

var tb=document.getElementById(id);

if(tb.style.display=='none') tb.style.display='block';

else tb.style.display='none';

}

</script>

</head>

<body>

<input type=button value="显示/隐藏" onClick="toggle('table1')"/>

<table border=1 id="table1">

<tr><td>2</td><td>3</td></tr>

</table>

</body>

</>

android 如何实现隐藏按钮

1.实现按钮的不可见

XML:android:visibility="invisible"

Ja代码:view.setVisibility(View.INVISIBLE);

2.实现按钮的隐藏

XML:android:visibility="gone"

Ja代码:view.setVisibility(View.GONE);

FLASH MX中,单击第一个按钮一个隐藏,单击第二按钮该重新显示如何实现

你把放到一个影片剪辑里,在调用时给一个实例名为mc1

在第一个按钮上加代码:on (press){

mc1._visible=0;(注:这里是设实例mc1不可见)

}

在第二个按钮上加代码:on (press){

mc1._visible=1;(注:这里是设实例mc1可见)

}

FLASH MX中,第一次单击按钮一个隐藏,第二次单击按钮该重新显示如何实现

按钮命名 n

命名 tp

代码写到帧上

this.n.onRelease=function(){

if(this._parent.tp._visible==true){

this._parent.tp._visible=false;

}else{

this._parent.tp._visible=true;

}

}

VB如何实现单击按钮就吧Excel内容显示在text上?

这个很简单的,需要的话看我百度空间

如何实现判断HTML内容进行显示隐藏

可以用jquery实现吧 ,用

eq(index).

index代表元素的索引.

比如你要第二个<p>的字的话,就是:

$(p).eq(1).text();

注意是是,要从0开始.

另外, 建议最好每个分一个不同的id,这样通过id判断就更加简单了.

按按钮显示表格,再按隐藏表格

$("input").click( function (){ $("table").toggle(); }) lz用JQuery吧 简单 input是你的按钮 table是你的表格

记得引入JQ库哦!

flash如何实现未单击按钮时影片剪辑隐藏,单击后可见并开始播放

首先确实你的实例名有没有问题,这段代码很简单的,如果哪里不明白,百度hi我

如何实现按钮单击 C#

在窗体加载时 就自动单击按钮 ?

意思就是一打开窗体,就触发(自动完成按钮功能)是吧 ?

那这样的话就不需要用到按钮也可以了

可以写好方法之后,再在加载窗体的时候调用这个方法就可以了

例子:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

namespace load

{

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

private void Form1_Load(object sender, EventArgs e)

{

add();加载窗体的时候条用add()方法

}

private void add()写好方法

{

int x = 10;

int y = 20;

int z = x + y;

label1.Text = z.ToString();

}

}

}

thinkphp5怎么跨数据库查询

其中的标签都做了不允许自动换行的设置,可以让table中的标签自动适应宽度而不换行。

<table width="99%">

<tr>

<td width="5%" nowrap>基本信息:</td>

<td width="7%" nowrap>工单类别:

<select class="easyui-combobox" id="wsType" style="width:90px;" editable="false">

<option value="0" selected>全部</option>

<c:forEach items="${wsTypeList}" var="typeModel">

<option value="${typeModel.value}">${typeModel.name}</option>

</c:forEach>

</select>

</td>

<td width="7%" nowrap>生成时间:

<select id="timeFlag" class="easyui-combobox" name="timeFlag" style="width:90px;" required="true">

<option value="0" selected="selected">今天</option>

<option value="1">昨天</option>

<option value="2">最近一周</option>

<option value="3">最近一个月</option>

<option value="4">最近六个月</option>

<option value="5">最近一年</option>

<option value="6">最近二年</option>

<option value="7">最近三年</option>

<option value="8">自定义</option>

</select>

</td>

<td width="7%" nowrap><div id="start" style="display:none">开始时间: <input id="startDate" style="width:90px;" class="Wdate" type="text" onFocus="var endDate=$dp.$('endDate');WdatePicker({onpicked:function(){endDate.focus();},maxDate:'#F{$dp.$D(\'endDate\')}'})"/></div></td>

<td width="7%" nowrap><div id="end" style="display:none">结束时间: <input id="endDate" style="width:90px;" class="Wdate" type="text" onFocus="WdatePicker({minDate:'#F{$dp.$D(\'startDate\')}'})"/></div></td>

<td width="7%" nowrap></td>

</tr>

<tr>

<td>用户信息:</td>

<td>用户名称: <input type="text" id="userName" style="width:80px;"></td>

<td>营业户号: <input type="text" style="width:80px;" id="puUserNo2"/></td>

<td>行政区域:

<select class="easyui-combobox" id="userCode" style="width:65px;" editable="false">

<option value="0" selected>全部</option>

<c:forEach items="${useAdList}" var="typeModel">

<option value="${typeModel.value}">${typeModel.name}</option>

</c:forEach>

</select>

</td>

<td>电压等级:

<select class="easyui-combobox" id="volType" style="width:65px;" editable="false">

<option value="0" selected>全部</option>

<c:forEach items="${volList}" var="typeModel">

<option value="${typeModel.value}">${typeModel.name}</option>

</c:forEach>

</select>

</td>

<td>客户类型:

<select class="easyui-combobox" id="userType" style="width:65px;" editable="false">

<option value="0" selected="selected">全部</option>

<c:forEach items="${useTpList}" var="typeModel">

<option value="${typeModel.value}">${typeModel.name}</option>

</c:forEach>

</select>

</td>

</tr>

<tr>

<td width="5%" nowrap>终端信息:</td>

<td>终端地址: <input type="text" id="logicAddr" style="width:80px;"/></td>

<td>SIM 卡号: <input type="text" id="searchSimCode" style="width:80px;"/>

</td>

<td>终端型号:

<select class="easyui-combobox" id="rtuModel" style="width:65px;" editable="false">

<option value="0" selected="selected">全部</option>

<c:forEach items="${rtuModelList}" var="typeModel">

<option value="${typeModel.name}">${typeModel.name}</option>

</c:forEach>

</select>

</td>

<!--

<td>终端类别:

<select class="easyui-combobox" id="assetRtuType" style="width:90px;" editable="false">

<option value="0" selected="selected">全部</option>

<c:forEach items="${assetRtuTypeList}" var="typeModel">

<option value="${typeModel.value}">${typeModel.name}</option>

</c:forEach>

</select>

</td> -->

<td>电压监测:

<select class="easyui-combobox" id="volSupport" style="width:65px;" editable="false">

<option value="0" selected>全部</option>

<option value="1">启用</option>

<option value="2">不启用</option>

</select>

</td>

<td width="5%" nowrap>

</td>

<td width="5%" nowrap>

<input type="button" class="button" onclick="showTableList();" value=" 查 询 ">

</td>

</tr>

<tr>

<td width="5%" nowrap>

工单信息:

</td>

<td width="5%" nowrap>工单号 : <input type="text" id="fauId" style="width:90px;" editor="numberBox"/>

</td>

<td width="5%" nowrap>工单状态:

<select id="faultStat" class="easyui-combobox" style="width:90px;" editable="false">

<option value="0" selected>全部</option>

<c:forEach items="${statusList}" var="statusModel">

<option value="${statusModel.value}">${statusModel.name}</option>

</c:forEach>

</select>

</td>

<td width="5%" nowrap>

故障类型:

<select id="faultTyp" class="easyui-combobox" style="width:65px;" editable="false" multiple>

<option value="0" selected>全部</option>

<c:forEach items="${typeList}" var="typeModel">

<option value="${typeModel.value}">${typeModel.name}</option>

</c:forEach>

</select>

</td>

<td width="5%" nowrap>处 理 人:

<select id="doPerson" class="easyui-combobox" style="width:65px;" editable="false">

<option value="0" selected>全部</option>

<c:forEach items="${fieldUserList}" var="user">

<option value="${user.id}">${user.name}</option>

</c:forEach>

</select></td>

<td width="7%" nowrap>

故障处理:

<select id="handleTyp" class="easyui-combobox" style="width:65px;" editable="false" multiple>

<option value="0" selected>全部</option>

<c:forEach items="${handleTypeList}" var="htypeModel">

<option value="${htypeModel.value}">${htypeModel.name}</option>

</c:forEach>

</select>

</td>

<td width="10%" nowrap>

<input type="button" class="button" onclick="excel()" value=" 导 出 ">

</td>

</tr>

</table>

求cad常用命令

如果是mysql里面两个不同的数据库,应该是可以直接使用 [数据库名称].[表名]来关联的。TP指定的数据库,是因为他要缓存这个数据库的表字段等。试试看行不行,测试通过: SELECT a.*,b.* FROM table1 a LEFT JOIN db2.table2 b ON a.id=b.id

2021-06-28 Rstdio中DESeq2相关软件的安装

常用快捷键因CAD版本的不同快捷键偶有差异。*通过菜单栏的工具->自定义->编辑程序参数(acad.pgp(P)) 即可自定义快捷键。

A 圆弧;AA 测面积周长;AL 对齐

AR 阵列;AP 加载应用程序;ATE 编辑属性

B 创建块;BR 打断于点 用来分解一个整体的线

C 圆形;CO 复制;CLOSE 关闭;COL 颜色;CHA 矩形倒角

CTRL+1 特性面板;CTRL+2 打开图象管理器;CTRL+N 新建

CTRL+O 打开;CTRL+0 全屏;CTRL+P 打印

CAD技术作为杰出的工程技术成就,已广泛地应用于工程设计的各个领域。CAD系统的发展和应用使传统的产品设计方法与生产模式发生了深刻的变化,产生了巨大的社会经济效益。

目前CAD技术研究热点有计算机概念设计、计算机支持的协同设计、海量信息存储、管理及检索、设计法研究及其相关问题、支持创新设计等。 可以预见技术将有新的飞跃,同时还会引起一场设计变革。

扩展资料

国产CAD发展历程

中国CAD技术起源于国外CAD平台技术基础上的二次开发,随着中国企业对CAD应用需求的提升,国内众多CAD技术开发商纷纷通过开发基于国外平台软件的二次开发产品让国内企业真正普及了CAD,并逐渐涌现出一批真正优秀的CAD开发商。

在二次开发的基础上,部分顶尖的国内CAD开发商也逐渐探索出适合中国发展和需求模式的CAD,更加符合国内企业使用的CAD产品,他们的目的是开发最好的CAD,甚至是为全球提供最优的CAD技术。

至2014年除了提供优秀的CAD平台软件技术以外,一直以来积极推进国产CAD技术的发展,联合众多国产CAD二次开发商组成的国产CAD联盟,更是极大促进了国产CAD的发展壮大,为中国企业提供真正适合中国国情及应用需求的CAD解决方案。

百度百科-CAD

如何从uboot读取mac,然户传递到内核中

#首先升级R

install.packages("installr")

library(installr)

updateR()

library("BiocManager")

#Bioconductor version 3.12 (BiocManager 1.30.15), R 4.0.5 (2021-03-31) Bioconductor version '3.12' is out-of-date; the current release version '3.13' is ailable with R version '4.1'; see s://bioconductor.org/install

#重新更新Bioconductor

if (!requireNamespace("BiocManager", quietly = TRUE))

? install.packages("BiocManager")

BiocManager::install(version = "3.13")

#更新成功

library("BiocManager")

#通过BiocManager安装我们常用的R包

BiocManager::install("ggplot2")

BiocManager::install(c("ggplot2","ggtree","DESeq2"))

#一次安装多个包

BiocManager::install("DESeq2")

#错误: 无法载入程辑包‘GenomeInfoDb’

BiocManager::install("GenomeInfoDbData")

#测试软件DESeq2

library("DESeq2")

#开始,DESeq2包分析差异表达基因简单来说只有三步:构建dds矩阵,标准化,以及进行差异分析。

library(DESeq2)? #加载包

library(apeglm)

#Error in library(apeglm) : 不存在叫‘apeglm’这个名字的程辑包

BiocManager::install("apeglm")

####测试

library(DESeq2)? #加载包

library(apeglm)

安装成功。

以下为差异基因表达分析的相关脚本:

pvalue(pval): 统计学差异显著性检验指标。

qvalue(p-adjusted): 校正后的p值(qvalue=padj=FDR=Corrected p-Value=p-adjusted),是对p值进行了多重设检验,能更好地控制阳性率。

校正后的p值不同的几种表现形式,都是基于BH的方法进行多重设检验得到的。校正后的p值不同的展现形式是因为不同的分析软件产生的。

链接:s://.jianshu/p/b1f6b50fde0e

E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_24 vs 0/

E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_48 vs 0/

E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_48 vs 24/

致病疫霉

###############################################################################################

library(DESeq2)? #加载包

library(apeglm)

data.pi_Sae24 = read.table("E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_24 vs 0/pi_Sae24_count.csv",sep = ',',header = T,row.names = 1)

data.pi_Sly24 = read.table("E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_24 vs 0/pi_Sly24_count.csv",sep = ',',header = T,row.names = 1)

data.pi_Sme24 = read.table("E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_24 vs 0/pi_Sme24_count.csv",sep = ',',header = T,row.names = 1)

data.pi_Stu24 = read.table("E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_24 vs 0/pi_Stu24_count2.csv",sep = ',',header = T,row.names = 1)

condition.pi_Sae24 <- factor(c(rep('0',3),rep('24',5)),levels = c("0","24"))

condition.pi_Sly24 <- factor(c(rep('0',3),rep('24',5)),levels = c("0","24"))

condition.pi_Sme24 <- factor(c(rep('0',3),rep('24',5)),levels = c("0","24"))

condition.pi_Stu24 <- factor(c(rep('0',3),rep('24',5)),levels = c("0","24"))

colData.pi_Sae24 = data.frame(row.names= colnames(data.pi_Sae24),condition.pi_Sae24)

colData.pi_Sly24 = data.frame(row.names= colnames(data.pi_Sly24),condition.pi_Sly24)

colData.pi_Sme24 = data.frame(row.names= colnames(data.pi_Sme24),condition.pi_Sme24)

colData.pi_Stu24 = data.frame(row.names= colnames(data.pi_Stu24),condition.pi_Stu24)

dds.pi_Sae24 <- DESeqDataSetFromMatrix(data.pi_Sae24,colData.pi_Sae24,design = ~ condition.pi_Sae24)

dds.pi_Sly24 <- DESeqDataSetFromMatrix(data.pi_Sly24,colData.pi_Sly24,design = ~ condition.pi_Sly24)

dds.pi_Sme24 <- DESeqDataSetFromMatrix(data.pi_Sme24,colData.pi_Sme24,design = ~ condition.pi_Sme24)

dds.pi_Stu24 <- DESeqDataSetFromMatrix(data.pi_Stu24,colData.pi_Stu24,design = ~ condition.pi_Stu24)

dds.pi_Sae24 <-DESeq(dds.pi_Sae24)

resultsNames(dds.pi_Sae24)

dds.pi_Sly24 <-DESeq(dds.pi_Sly24)

resultsNames(dds.pi_Sly24)

dds.pi_Sme24 <-DESeq(dds.pi_Sme24)

resultsNames(dds.pi_Sme24)

dds.pi_Stu24 <-DESeq(dds.pi_Stu24)

resultsNames(dds.pi_Stu24)

res.pi_Sae24.24.0 = results(dds.pi_Sae24,contrast=c("condition.pi_Sae24","24","0"))

res.pi_Sly24.24.0 = results(dds.pi_Sly24,contrast=c("condition.pi_Sly24","24","0"))

res.pi_Sme24.24.0 = results(dds.pi_Sme24,contrast=c("condition.pi_Sme24","24","0"))

res.pi_Stu24.24.0 = results(dds.pi_Stu24,contrast=c("condition.pi_Stu24","24","0"))

order.res.pi_Sae24.24.0 <- res.pi_Sae24.24.0[order(res.pi_Sae24.24.0$pvalue),]

order.res.pi_Sly24.24.0 <- res.pi_Sly24.24.0[order(res.pi_Sly24.24.0$pvalue),]

order.res.pi_Sme24.24.0 <- res.pi_Sme24.24.0[order(res.pi_Sme24.24.0$pvalue),]

order.res.pi_Stu24.24.0 <- res.pi_Stu24.24.0[order(res.pi_Stu24.24.0$pvalue),]

setwd("E:/SolPanTP/RawData/诺禾转录组测序(310)/05 数据分析/DESeq2/log2FC+p value/pi/pi_24 vs 0")

write.csv(order.res.pi_Sae24.24.0,file = "order.res.pi_Sae24.24.0.csv",quote = F)

write.csv(order.res.pi_Sly24.24.0,file = "order.res.pi_Sly24.24.0.csv",quote = F)

write.csv(order.res.pi_Sme24.24.0,file = "order.res.pi_Sme24.24.0.csv",quote = F)

write.csv(order.res.pi_Stu24.24.0,file = "order.res.pi_Stu24.24.0.csv",quote = F)

diffgene_pi_Sae24.24.0_deseq2 <- subset(order.res.pi_Sae24.24.0,padj < 0.01 & abs(log2FoldChange) >2)

diffgene_pi_Sly24.24.0_deseq2 <- subset(order.res.pi_Sly24.24.0,padj < 0.01 & abs(log2FoldChange) >2)

diffgene_pi_Sme24.24.0_deseq2 <- subset(order.res.pi_Sme24.24.0,padj < 0.01 & abs(log2FoldChange) >2)

diffgene_pi_Stu24.24.0_deseq2 <- subset(order.res.pi_Stu24.24.0,padj < 0.01 & abs(log2FoldChange) >2)

write.csv(diffgene_pi_Sae24.24.0_deseq2,file = "diffgene_pi_Sae24.24.0_deseq2.csv",quote = F)

write.csv(diffgene_pi_Sly24.24.0_deseq2,file = "diffgene_pi_Sly24.24.0_deseq2.csv",quote = F)

write.csv(diffgene_pi_Sme24.24.0_deseq2,file = "diffgene_pi_Sme24.24.0_deseq2.csv",quote = F)

write.csv(diffgene_pi_Stu24.24.0_deseq2,file = "diffgene_pi_Stu24.24.0_deseq2.csv",quote = F)

U-boot会给Linux Kernel传递很多参数,如:串口,RAM,videofb等。而Linux kernel也会读取和处理这些参数。两者之间通过struct tag来传递参数。U-boot把要传递给kernel的东西保存在struct tag数据结构中,启动kernel时,把这个结构体的物理地址传给kernel;Linux kernel通过这个地址,用parse_tags分析出传递过来的参数。

本文主要以U-boot传递RAM和Linux kernel读取RAM参数为例进行说明。

1、u-boot给kernel传RAM参数

./common/cmd_bootm.c文件中(指Uboot的根目录),bootm命令对应的do_bootm函数,当分析uImage中信息发现OS是Linux时,调用。/lib_arm/bootm.c文件中的do_bootm_linux函数来启动Linux kernel。

在do_bootm_linux函数中:

void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],\

ulong addr, ulong *len_ptr, int verify)

{

……

#if defined (CONFIG_SETUP_MEMORY_TS) || \

defined (CONFIG_CMDLINE_T) || \

defined (CONFIG_INITRD_T) || \

defined (CONFIG_SERIAL_T) || \

defined (CONFIG_REVISION_T) || \

defined (CONFIG_LCD) || \

defined (CONFIG_VFD)

setup_start_tag (bd); //初始化tag结构体开始

#ifdef CONFIG_SERIAL_T

setup_serial_tag (?ms);

#endif

#ifdef CONFIG_REVISION_T

setup_revision_tag (?ms);

#endif

#ifdef CONFIG_SETUP_MEMORY_TS

setup_memory_tags (bd); //设置RAM参数

#endif

#ifdef CONFIG_CMDLINE_T

setup_commandline_tag (bd, commandline);

#endif

#ifdef CONFIG_INITRD_T

if (initrd_start && initrd_end)

setup_initrd_tag (bd, initrd_start, initrd_end);

#endif

#if defined (CONFIG_VFD) || defined (CONFIG_LCD)

setup_videolfb_tag ((gd_t *) gd);

#endif

setup_end_tag (bd); //初始化tag结构体结束

#endif

……

……

theKernel (0, machid, bd->bi_boot_params);

//传给Kernel的参数= (struct tag *)型的bd->bi_boot_params

//bd->bi_boot_params在board_init 函数中初始化,如对于at91rm9200,初始化在at91rm9200dk.c的board_init中进 行:bd->bi_boot_params=PHYS_SDRAM + 0x100;

//这个地址也是所有taglist的首地址,见下面的setup_start_tag函数

}

对于setup_start_tag和setup_memory_tags函数说明如下。

函数setup_start_tag也在此文件中定义,如下:

static void setup_start_tag (bd_t *bd)

{

params = (struct tag *) bd->bi_boot_params;

//初始化(struct tag *)型的全局变量params为bd->bi_boot_params的地址,之后的setup tags相关函数如下面的setup_memory_tags就把其它tag的数据放在此地址的偏移地址上。

params->hdr.tag = AT_CORE;

params->hdr.size = tag_size (tag_core);

params->u.core.flags = 0;

params->u.core.pagesize = 0;

params->u.core.rootdev = 0;

params = tag_next (params);

}

RAM相关参数在bootm.c中的函数setup_memory_tags中初始化:

static void setup_memory_tags (bd_t *bd)

{

int i;

for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {

params->hdr.tag = AT_MEM;

params->hdr.size = tag_size (tag_mem32);

params->u.mem.start = bd->bi_dram[i].start;

params->u.mem.size = bd->bi_dram[i].size;

params = tag_next (params);

} //初始化内存相关tag

}

2、Kernel读取U-boot传递的相关参数

对于Linux Kernel,ARM平台启动时,先执行arch/arm/kernel/head.S,此文件会调用arch/arm/kernel/head- common.S和arch/arm/mm/proc-arm920.S中的函数,并最后调用start_kernel:

……

b start_kernel

……

init/main.c中的start_kernel函数中会调用setup_arch函数来处理各种平台相关的动作,包括了u-boot传递过来参数的分析和保存:

start_kernel()

{

……

setup_arch(&command_line);

……

}

其中,setup_arch函数在arch/arm/kernel/setup.c文件中实现,如下:

void __init setup_arch(char **cmdline_p)

{

struct tag *tags = (struct tag *)&init_tags;

struct machine_desc *mdesc;

char *from = default_command_line;

setup_processor();

mdesc = setup_machine(machine_arch_type);

machine_name = mdesc->name;

if (mdesc->soft_reboot)

reboot_setup("s");

if (__atags_pointer)

//指向各种tag起始位置的指针,定义如下:

//unsigned int __atags_pointer __initdata;

//此指针指向__initdata段,各种tag的信息保存在这个段中。

tags = phys_to_virt(__atags_pointer);

else if (mdesc->boot_params)

tags = phys_to_virt(mdesc->boot_params);

if (tags->hdr.tag != AT_CORE)

convert_to_tag_list(tags);

if (tags->hdr.tag != AT_CORE)

tags = (struct tag *)&init_tags;

if (mdesc->fixup)

mdesc->fixup(mdesc, tags, &from, &meminfo);

if (tags->hdr.tag == AT_CORE) {

if (meminfo.nr_banks != 0)

squash_mem_tags(tags);

se_atags(tags);

parse_tags(tags);

//处理各种tags,其中包括了RAM参数的处理。

//这个函数处理如下tags:

__tagtable(AT_MEM, parse_tag_mem32);

__tagtable(AT_VIDEOTEXT, parse_tag_videotext);

__tagtable(AT_RAMDISK, parse_tag_ramdisk);

__tagtable(AT_SERIAL, parse_tag_serialnr);

__tagtable(AT_REVISION, parse_tag_revision);

__tagtable(AT_CMDLINE, parse_tag_cmdline);

}

init_mm.start_code = (unsigned long) &_text;

init_mm.end_code = (unsigned long) &_etext;

init_mm.end_data = (unsigned long) &_edata;

init_mm.brk = (unsigned long) &_end;

memcpy(boot_command_line, from, COMMAND_LINE_SIZE);

boot_command_line[COMMAND_LINE_SIZE-1] = '\0';

parse_cmdline(cmdline_p, from); //处理编译内核时指定的cmdline或u-boot传递的cmdline

paging_init(&meminfo, mdesc);

request_standard_resources(&meminfo, mdesc);

#ifdef CONFIG_SMP

smp_init_cpus();

#endif

cpu_init();

init_arch_irq = mdesc->init_irq;

system_timer = mdesc->timer;

init_machine = mdesc->init_machine;

#ifdef CONFIG_VT

#if defined(CONFIG_VGA_CONSOLE)

conswitchp = &vga_con;

#elif defined(CONFIG_DUMMY_CONSOLE)

conswitchp = &dummy_con;

#endif

#endif

early_trap_init();

}

对于处理RAM的tag,调用了parse_tag_mem32函数:

static int __init parse_tag_mem32(const struct tag *tag)

{

……

arm_add_memory(tag->u.mem.start, tag->u.mem.size);

……

}

__tagtable(AT_MEM, parse_tag_mem32);

上述的arm_add_memory函数定义如下:

static void __init arm_add_memory(unsigned long start, unsigned long size)

{

struct membank *bank;

size -= start & ~PE_MASK;

bank = &meminfo.bank[meminfo.nr_banks++];

bank->start = PE_ALIGN(start);

bank->size = size & PE_MASK;

bank->node = PHYS_TO_NID(start);

}

如上可见,parse_tag_mem32函数调用arm_add_memory函数把RAM的start和size等参数保存到了meminfo结构的meminfo结构体中。最后,在setup_arch中执行下面语句:

paging_init(&meminfo, mdesc);

对没有MMU的平台上调用arch/arm/mm/nommu.c中的paging_init,否则调用arch/arm/mm/mmu.c中的paging_init函数。这里暂不分析mmu.c中的paging_init函数。