文档库 最新最全的文档下载
当前位置:文档库 › 《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动

《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动
《Linux设备驱动开发详解:基于最新的Linux 4.0内核》19. Linux电源管理系统架构和驱动

以下电子书来源于宋宝华《Linux设备驱动开发详解:基于最新的Linux 4.0内核》第19章《Linux电源管理系统架构和驱动》

本章导读

Linux在消费电子领域的应用已经铺天盖地,而对于消费电子产品而言,省电是一个重要的议题。

本章将介绍Linux设备树(Device Tree)的起源、结构和因为设备树而引起的驱动和BSP 变更。

19.1节阐述了Linux电源管理的总体架构。

19.2~19.8节分别论述了CPUFreq、CPUIdle、CPU热插拔以及底层的基础设施Regulator、OPP以及电源管理的调试工具PowerTop。

19.9节讲解了系统Suspend to RAM的过程以及设备驱动如何提供对Suspend to RAM的支持。

19.10节讲解了设备驱动的Runtime suspend。

本章是相对《Linux设备驱动开发详解(第2版)》全新的一章内容,也是Linux设备驱动工程师必备的知识体系。

第十九章Linux电源管理系统架构和驱动

1.Linux电源管理全局架构

Linux电源管理非常复杂,牵扯到系统级的待机、频率电压变换、系统空闲时的处理以及每个设备驱动对于系统待机的支持和每个设备的运行时电源管理,可以说和系统中的每个设备驱动都息息相关。

对于消费电子产品来说,电源管理相当重要。因此,这部分工作往往在开发周期中占据相当大的比重,图19.1呈现了Linux内核电源管理的整体架构。大体可以归纳为如下几类:

1.CPU在运行时根据系统负载进行动态电压和频率变换的CPUFreq

2.CPU在系统空闲时根据空闲的情况进行低功耗模式的CPUIdle

3.多核系统下CPU的热插拔支持

4.系统和设备对于延迟的特别需求而提出申请的PM QoS,它会作用于CPUIdle的具体

策略

5.设备驱动针对系统Suspend to RAM/Disk的一系列入口函数

6.SoC进入suspend状态、SDRAM自刷新的入口

7.设备的runtime(运行时)动态电源管理,根据使用情况动态开关设备

8.底层的时钟、稳压器、频率/电压表(OPP模块完成)支撑,各驱动子系统都可能用

图19.1 Linux电源管理系统架构

2.CPUFreq驱动

CPUFreq子系统位于drivers/cpufreq目录,负责进行运行过程中CPU频率和电压的动态

调整,即DVFS(Dynamic Voltage Frequency Scaling,动态电压频率调整)。运行时进行CPU 电压和频率调整的原因是:CMOS电路中的功耗与电压的平方成正比、与频率成正比(),因此降低电压和频率可降低功耗。

CPUFreq的核心层位于drivers/cpufreq/cpufreq.c,它为各个SoC的CPUFreq驱动的实现提供了一套统一的接口,并实现了一套notifier的机制,可以在CPUFreq的policy和频率改变的时候向其他模块发出通知。另外,在CPU运行频率发生变化的时候,内核的loops_per_jiffy常数也会发生相应变化。

1.1 SoC的CPUFreq驱动实现

具体的每个SoC的CPUFreq驱动实例只需要实现电压、频率表,以及从硬件层面完成这些变化。

CPUFreq核心层提供了如下API供SoC注册自身的CPUFreq驱动:

int cpufreq_register_driver(struct cpufreq_driver *driver_data);

其参数为一个cpufreq_driver结构体指针,实际上,cpufreq_driver封装了一个具体的SoC 的CPUFreq驱动的主体,该结构体形如代码清单19.1。

代码清单19.1 cpufreq_driver结构体

1 struct cpufreq_driver {

2 struct module *owner;

3 char name[CPUFREQ_NAME_LEN];

4 u8 flags;

5

6 /* needed by all drivers */

7 int (*init) (struct cpufreq_policy *policy);

8 int (*verify) (struct cpufreq_policy *policy);

9

10 /* define one out of two */

11 int (*setpolicy) (struct cpufreq_policy *policy);

12 int (*target) (struct cpufreq_policy *policy,

13 unsigned inttarget_freq,

14 unsigned int relation);

15

16 /* should be defined, if possible */

17 unsigned int (*get) (unsigned intcpu);

18

19 /* optional */

20 unsigned int (*getavg) (struct cpufreq_policy *policy,

21 unsigned intcpu);

22 int (*bios_limit) (intcpu, unsigned int *limit);

23

24 int (*exit) (struct cpufreq_policy *policy);

25 int (*suspend) (struct cpufreq_policy *policy);

26 int (*resume) (struct cpufreq_policy *policy);

27 structfreq_attr **attr;

28 };

其中的owner成员一般被设置为THIS_MODULE;name成员是CPUFreq驱动名字,如drivers/cpufreq/s5pv210-cpufreq.c设置name为"s5pv210",如drivers/cpufreq/omap-cpufreq.c 设置name为"omap";flags是一些暗示性的标志,譬如,若设置了CPUFREQ_CONST_LOOPS,则是告诉内核loops_per_jiffy不会因为CPU频率的变化而变化。

init()成员是一个per-CPU初始化函数指针,每当一个新的CPU被注册进系统的时候,该函数就被调用,该函数接受一个cpufreq_policy的指针参数,在init()成员函数中,可进行如

下设置:

policy->cpuinfo.min_freq

policy->cpuinfo.max_freq

该CPU支持的最小频率和最大频率(单位是kHz)。

policy->cpuinfo.transition_latency

CPU进行频率切换所需要的延迟(单位是纳秒)

policy->cur

CPU当前频率

policy->policy

policy->governor

policy->min

policy->max

定义该CPU的缺省policy,以及缺省policy情况下该policy支持的最小、最大CPU频率。

verify()成员函数用于对用户的CPUFreq policy设置进行有效性验证和数据修正。每次用户设定一个新policy时,该函数根据老的policy和新的policy,检验新policy设置的有效性并对无效设置进行必要的修正。在该成员函数的具体实现中,常用到如下辅助函数:cpufreq_verify_within_limits(struct cpufreq_policy *policy, unsigned intmin_freq, unsigned intmax_freq);

setpolicy()成员函数接受一个policy参数(包含policy->policy, policy->min和policy->max 等成员),实现了这个成员函数的CPU一般具备在一个范围(limit, 从policy->min到policy->max)里面自动调整频率的能力。目前少数驱动如intel_pstate.c和longrun.c包含这样的成员函数。而绝大多数CPU都不会实现此函数,一般实现target()成员函数,target()的参数直接就是一个指定的频率。

target()成员函数用于将频率调整到一个指定的值,接受3个参数:policy、target_freq 和relation。target_freq是目标频率,实际驱动总是要设定真实的CPU频率到最接近于target_freq,并且设定的频率必须位于policy->min到policy->max之间。在设定频率接近target_freq的情况下,relation若为CPUFREQ_REL_L,暗示设置的频率应该大于或等于target_freq;relation若为CPUFREQ_REL_H,暗示设置的频率应该小于或等于target_freq。

下表描述了setpolicy()和target()所针对的CPU以及调用方式上的区别:

由于芯片内部PLL和分频器的关系,ARM SoC一般不具备独立调整频率的能力,往往SoC 的CPUFreq驱动会提供一个频率表,在该表的范围内进行变更,所以一般实现target()成员函数。

CPUFreq核心层提供了一组频率表相关的辅助API。

int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,

struct cpufreq_frequency_table *table);

它是cpufreq_driver的init()成员函数的助手,用于将policy->min和policy->max设置为与cpuinfo.min_freq和cpuinfo.max_freq相同的值。

int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,

struct cpufreq_frequency_table *table);

它是cpufreq_driver的verify()成员函数的助手,确保至少1个有效的CPU频率位于policy->min到policy->max范围内。

int cpufreq_frequency_table_target(struct cpufreq_policy *policy,

struct cpufreq_frequency_table *table,

unsigned int target_freq,

unsigned int relation,

unsigned int *index);

它是cpufreq_driver的target()成员函数的助手,返回需要设定的频率在频率表中的索引。

省略掉具体的细节,1个SoC的CPUFreq驱动的实例drivers/cpufreq/s3c64xx-cpufreq.c 的核心结构如代码清单19.2。

代码清单19.2 S3C64XX的CPUFreq驱动

001 static unsigned long regulator_latency;

002

003 struct s3c64xx_dvfs {

004 unsigned intvddarm_min;

005 unsigned intvddarm_max;

006 };

007

008 static struct s3c64xx_dvfs s3c64xx_dvfs_table[] = {

009 [0] = { 1000000, 1150000 },

010 …

011 [4] = { 1300000, 1350000 },

012 };

013

014 static struct cpufreq_frequency_table s3c64xx_freq_table[] = {

015 { 0, 66000 },

016 { 0, 100000 },

017 …

018 { 0, CPUFREQ_TABLE_END },

019 };

020

021 static int s3c64xx_cpufreq_verify_speed(struct cpufreq_policy *policy)

022 {

023 if (policy->cpu != 0)

024 return -EINVAL;

025

026 return cpufreq_frequency_table_verify(policy, s3c64xx_freq_table);

027 }

028

029 static unsigned int s3c64xx_cpufreq_get_speed(unsigned intcpu)

030 {

031 if (cpu != 0)

032 return 0;

033

034 return clk_get_rate(armclk) / 1000;

035 }

036

037 static int s3c64xx_cpufreq_set_target(struct cpufreq_policy *policy,

038 unsigned int target_freq,

039 unsigned int relation)

040 {

041 …

042 ret = cpufreq_frequency_table_target(policy, s3c64xx_freq_table,

043 target_freq, relation, &i);

044 …

045 freqs.cpu = 0;

046 freqs.old = clk_get_rate(armclk) / 1000;

047 freqs.new = s3c64xx_freq_table[i].frequency;

048 freqs.flags = 0;

049 dvfs = &s3c64xx_dvfs_table[s3c64xx_freq_table[i].index];

050

051 if (freqs.old == freqs.new)

052 return 0;

053

054 cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);

055

056 if (vddarm&&freqs.new>freqs.old) {

057 ret = regulator_set_voltage(vddarm,

058 dvfs->vddarm_min,

059 dvfs->vddarm_max);

060 …

061 }

062

063 ret = clk_set_rate(armclk, freqs.new * 1000);

064 …

065 cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);

066

067 if (vddarm&&freqs.new

068 ret = regulator_set_voltage(vddarm,

069 dvfs->vddarm_min,

070 dvfs->vddarm_max);

071 …

072 }

073

074 return 0;

075 }

076

077 static int s3c64xx_cpufreq_driver_init(struct cpufreq_policy *policy)

078 {

079 …

080 armclk = clk_get(NULL, "armclk");

081 …

082 vddarm = regulator_get(NULL, "vddarm");

083 …

084 s3c64xx_cpufreq_config_regulator();

085

086 freq = s3c64xx_freq_table;

087 while (freq->frequency != CPUFREQ_TABLE_END) {

088 unsigned long r;

089 …

090 }

091

092 policy->cur = clk_get_rate(armclk) / 1000;

093 policy->cpuinfo.transition_latency = (500 * 1000) + regulator_latency; 094 ret = cpufreq_frequency_table_cpuinfo(policy, s3c64xx_freq_table);

095 …

096 return ret;

097 }

098

099 staticstruct cpufreq_driver s3c64xx_cpufreq_driver = {

100 .owner = THIS_MODULE,

101 .flags = 0,

102 .verify = s3c64xx_cpufreq_verify_speed,

103 .target = s3c64xx_cpufreq_set_target,

104 .get = s3c64xx_cpufreq_get_speed,

105 .init = s3c64xx_cpufreq_driver_init,

106 .name = "s3c",

107 };

108

109 static int __init s3c64xx_cpufreq_init(void)

110 {

111 return cpufreq_register_driver(&s3c64xx_cpufreq_driver);

112 }

113 module_init(s3c64xx_cpufreq_init);

第37行s3c64xx_cpufreq_set_target()就是完成目标频率设置的函数,它调用了cpufreq_frequency_table_target()从s3c64xx支持的频率表s3c64xx_freq_table里找到合适的频率。在具体的频率和电压设置环节,用的都是Linux的标准API regulator_set_voltage()和clk_set_rate()之类的函数。

第111行在模块初始化的时候透过cpufreq_register_driver()注册了cpufreq_driver的实例,第94行,CPUFreq的初始化阶段调用cpufreq_frequency_table_cpuinfo()注册了频率表。关于频率表,比较新的内核喜欢使用后面章节将介绍的OPP。

在当前的Linux内核中,存在一个通用的cpufreq-dt驱动,位于drivers/cpufreq/cpufreq-dt.c,很多SoC都可以兼容这个驱动,“grep”arch/arm/的代码发现mach-imx/imx27-dt.c、mach-imx/mach-imx51.c、mach-imx/mach-imx53.c、mach-mvebu/pmsu.c、mach-omap2/pm.c、mach-rockchip/rockchip.c、mach-shmobile/cpufreq.c、mach-sunxi/sunxi.c、mach-sunxi/sunxi.c 都注册了cpufreq-dt平台设备。

1.2 CPUFreq的policy

SoC CPUFreq驱动只是设定了CPU的频率参数,以及提供了设置频率的途径,但是它并不会管自身CPU究竟应该运行在什么频率上。究竟频率依据什么样的标准,进行何种变化,

在Android系统中,则增加了1个interactive policy,该policy适合对延迟敏感的UI交互任务,当有UI交互任务的时候,该policy会更加激进和及时地调整CPU频率。

总地来说,系统的状态以及CPUFreq的Policy共同决定了CPU频率跳变的target,CPUFreq 核心层并将target频率传递给底层具体SoC的CPUFreq驱动,该驱动修改硬件,完成频率的变换,如图19.2所示。

图19.2 CPUFreq、系统负载、policy与调频

用户空间一般可通过/sys/devices/system/cpu/cpux/cpufreq结点来设置CPUFreq。譬如,我们要设置CPUFreq到700MHz,采用userspace策略,则运行如下命令:# echo userspace > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# echo 700000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_setspeed

1.3 CPUFreq的性能测试和调优

Linux 3.1以后的内核已经将cpupower-utils工具集放入内核的tools/power/cpupower目录,该工具集当中的cpufreq-bench工具可帮助工程师分析采用CPUFreq后对系统性能的影响。

cpufreq-bench工具的工作原理是模拟系统运行时候的“空闲——忙——空闲——忙”场景,从而触发系统的动态频率变化,然后计算在使用ondemand、conservative、interactive 等policy的情况下,做同样的运算与在performance高频模式下做同样运算完成任务的时间比例。

交叉编译该工具后,可放入目标电路板文件系统的/usr/sbin/等目录,运行该工具:

# cpufreq-bench -l 50000 -s 100000 -x 50000 -y 100000 -g ondemand -r 5 -n 5 -v 会输出一系列的结果,我们提取其中的Round n这样的行,它表明了-g ondemand选项中设定的ondemand policy相对于performance policy的性能比例,假设值为:Round 1 - 39.74%

Round 2 - 36.35%

Round 3 - 47.91%

Round 4 - 54.22%

Round 5 - 58.64%

显然不太理想,我们在同样的平台下采用Android的interactive policy,得到新的测试结果:

Round 1 - 72.95%

Round 2 - 87.20%

Round 3 - 91.21%

Round 4 - 94.10%

Round 5 - 94.93%

一般的目标是采用CPUFreq动态调整频率和电压后,性能应该为performance这个高性能policy情况下的90%左右比较理想。

1.4 CPUFreq通知

两种情况下,CPUFreq子系统会发出通知:CPUFreq的policy变化或者CPU运行频率变化。

在policy变化的过程中,会发送3次通知:

●CPUFREQ_ADJUST:所有注册的notifier可以根据硬件或者温度的考虑去修改limit(即

policy->min和policy->max);

●CPUFREQ_INCOMPATIBLE:除非前面的policy设定可能会导致硬件的出错,被注册的

notifier才可以改变limit等设定;

●CPUFREQ_NOTIFY:所有注册的notifier都会被告知新的policy已经被设置。

在频率变化的过程中,会发送2次通知:

●CPUFREQ_PRECHANGE:准备进行频率变更;

●CPUFREQ_POSTCHANGE:已经完成频率变更。

notifier中的第3个参数是一个cpufreq_freqs的结构体,包含cpu(CPU号)、old(过去的频率)和new(现在的频率)这3个成员。发送CPUFREQ_PRECHANGE和CPUFREQ_POSTCHANGE的代码如下:

srcu_notifier_call_chain(&cpufreq_transition_notifier_list,

CPUFREQ_PRECHANGE, freqs);

srcu_notifier_call_chain(&cpufreq_transition_notifier_list,

CPUFREQ_POSTCHANGE, freqs);

如果某模块关心CPUFREQ_PRECHANGE或CPUFREQ_POSTCHANGE事件,可简单地使用Linux notifier机制监控之。譬如,drivers/video/sa1100fb.c在CPU频率变化过程中需对自身硬件进行相关设置,则它注册了notifier并在CPUFREQ_PRECHANGE和CPUFREQ_POSTCHANGE 情况下分别进行不同的处理,如代码清单19.3。

代码清单19.3 CPUFreq notifier案例

01 fbi->freq_transition.notifier_call = sa1100fb_freq_transition;

02 cpufreq_register_notifier(&fbi->freq_transition, CPUFREQ_TRANSITION_NOTIFIER);

03 ...

04 sa1100fb_freq_transition(structnotifier_block *nb, unsigned long val,

05 void *data)

06 {

07 struct sa1100fb_info *fbi = TO_INF(nb, freq_transition);

08 struct cpufreq_freqs *f = data;

09 u_intpcd;

10

11 switch (val) {

12 case CPUFREQ_PRECHANGE:

13 set_ctrlr_state(fbi, C_DISABLE_CLKCHANGE);

14 break;

15 case CPUFREQ_POSTCHANGE:

16 pcd = get_pcd(fbi->fb.var.pixclock, f->new);

17 fbi->reg_lccr3 = (fbi->reg_lccr3& ~0xff) | LCCR3_PixClkDiv(pcd);

18 set_ctrlr_state(fbi, C_ENABLE_CLKCHANGE);

19 break;

20 }

21 return 0;

22 }

此外,如果在系统suspend/resume的过程中CPU频率会发生变化,则CPUFreq子系统也会发出CPUFREQ_SUSPENDCHANGE和CPUFREQ_RESUMECHANGE这2个通知。

值得一提的是,除了CPU以外,一些非CPU设备也支持多个操作频率和电压,存在多

个OPP。Linux 3.2之后的内核也支持针对这种非CPU设备的DVFS,该套子系统为Devfreq。与CPUFreq存在一个drivers/cpufreq目录相似,在内核也存在一个drivers/devfreq的目录。

3.CPUIdle驱动

目前的ARM SoC大多支持几个不同的IDLE级别,CPUIdle驱动子系统存在的目的就是对这些IDLE状态进行管理,并根据系统的运行情况进入不同的IDLE级别。具体SoC的底层CPUIdle驱动实现则提供一个类似于CPUFreq驱动频率表的IDLE级别表,并实现各种不同IDLE 状态的进入和退出流程。

对于Intel系列笔记本电脑而言,支持ACPI(Advanced Configuration and Power Interface,高级配置和电源管理接口),一般有4个不同的C状态(其中C0为操作状态,C1是Halt状态,C2是Stop-Clock状态,C3是Sleep状态):

而对于ARM而言,各个SoC对于IDLE的实现方法差异比较大,最简单的IDLE级别莫过于将CPU核置于WFI(等待中断发生)状态,因此默认情况下,若SoC未实现自身的芯片级CPUIdle驱动,则会进入cpu_do_idle(),对于ARM V7而言,其实现位于arch/arm/mm/proc-v7.S:

ENTRY(cpu_v7_do_idle)

dsb @ WFI may enter a low-power mode

wfi

mov pc, lr

ENDPROC(cpu_v7_do_idle)

与CPUFreq类似,CPUIdle的核心层提供了如下API用于注册一个cpuidle_driver的实例:int cpuidle_register_driver(struct cpuidle_driver *drv);

并提供了如下API来注册一个cpuidle_device:

int cpuidle_register_device(struct cpuidle_device *dev);

CPUIdle驱动必须针对每个CPU注册相应的cpuidle_device,这意味着对于多核CPU而言,需要针对每个CPU注册一次。

cpuidle_register_driver()接受1个cpuidle_driver结构体的指针参数,该结构体是CPUIdle 驱动的主体,其定义如代码清单19.4。

代码清单19.4 cpuidle_driver结构体

01 struct cpuidle_driver {

02 const char *name;

03 struct module *owner;

04

05 unsigned int power_specified:1;

06 /* set to 1 to use the core cpuidle time keeping (for all states). */

07 unsigned int en_core_tk_irqen:1;

08 struct cpuidle_state states[CPUIDLE_STATE_MAX];

09 int state_count;

10 int safe_state_index;

11 };

该结构体的关键成员是1个cpuidle_state的表,其实就是存储各种不同IDLE级别的信

息,它的定义如代码清单19.5。

代码清单19.5 cpuidle_state结构体

01 struct cpuidle_state {

02 char name[CPUIDLE_NAME_LEN];

03 char desc[CPUIDLE_DESC_LEN];

04

05 unsigned int flags;

06 unsigned intexit_latency; /* in US */

07 int power_usage; /* in mW */

08 unsigned inttarget_residency; /* in US */

09 bool disabled; /* disabled on all CPUs */

10

11 int (*enter) (struct cpuidle_device *dev,

12 struct cpuidle_driver *drv,

13 int index);

14

15 int (*enter_dead) (struct cpuidle_device *dev, int index);

16 };

name和desc是该IDLE状态的名称和描述,exit_latency是退出该IDLE状态需要的延迟,enter()是进入该IDLE状态的实现方法。

省略细节,一个具体的SoC的CPUIdle驱动实例可见于arch/arm/mach-ux500/cpuidle.c (最新的内核已经将代码转移到了drivers/cpuidle/cpuidle-ux500.c),它有2个IDLE级别,即“WFI”和“ApIdle”,其具体实现框架如代码清单19.6。

代码清单19.6 ux500 CPUIdle驱动案例

01 staticatomic_t master = ATOMIC_INIT(0);

02 static DEFINE_SPINLOCK(master_lock);

03 static DEFINE_PER_CPU(struct cpuidle_device, ux500_cpuidle_device);

04

05 static inline int ux500_enter_idle(struct cpuidle_device *dev,

06 struct cpuidle_driver *drv, int index)

07 {

08 …

09 }

10

11 staticstruct cpuidle_driver ux500_idle_driver = {

12 .name = "ux500_idle",

13 .owner = THIS_MODULE,

14 .en_core_tk_irqen = 1,

15 .states = {

16 ARM_CPUIDLE_WFI_STATE,

17 {

18 .enter = ux500_enter_idle,

19 .exit_latency = 70,

20 .target_residency = 260,

21 .flags = CPUIDLE_FLAG_TIME_VALID,

22 .name = "ApIdle",

23 .desc = "ARM Retention",

24 },

25 },

26 .safe_state_index = 0,

27 .state_count = 2,

28 };

29

30 /*

31 * For each cpu, setup the broadcast timer because we will

32 * need to migrate the timers for the states >= ApIdle.

33 */

34 static void ux500_setup_broadcast_timer(void *arg)

35 {

36 intcpu = smp_processor_id();

37 clockevents_notify(CLOCK_EVT_NOTIFY_BROADCAST_ON, &cpu);

38 }

39

40 int __init ux500_idle_init(void)

41 {

42 …

43 ret = cpuidle_register_driver(&ux500_idle_driver);

44 …

45 for_each_online_cpu(cpu) {

46 device = &per_cpu(ux500_cpuidle_device, cpu);

47 device->cpu = cpu;

48 ret = cpuidle_register_device(device);

49 …

50 }

51 …

52 }

53 device_initcall(ux500_idle_init);

与CPUFreq类似,在CPUIdle子系统也有对应的governor来抉择何时进入何种IDLE级别的策略,这些governor包括CPU_IDLE_GOV_LADDER、CPU_IDLE_GOV_MENU。LADDER在进入和退出IDLE级别的时候是步进的,它以过去的IDLE时间作为参考,而MENU总是根据预期的空闲时间直接进入目标IDLE级别。前者可适用于没有采用动态时间节拍的系统(即没有选择NO_HZ的系统),不依赖于NO_HZ配置选项,后者依赖于内核的NO_HZ选项。

下图演示了LADDER步进从C0进入C3,而MENU则可能直接从C0跳入C3:

图19.3 LADDER与MENU的区别

CPUIdle子系统还透过sys向userspace导出了一些结点:

●一类是针对整个系统的/sys/devices/system/cpu/cpuidle,透过其中的current_driver、

current_governor、available_governors等结点可以获取或设置CPUIdle的驱动信息以及governor。

●一类是针对每个CPU的/sys/devices/system/cpu/cpux/cpuidle/,通过子结点暴露各个

online的CPU中每个不同IDLE级别的name、desc、power、latency等信息。

综合以上的各个要素,可以给出Linux CPUIdle子系统的总体架构如图19.4。

图19.4 CPUIdle子系统架构

4.PowerTop

PowerTop是一款开源的用于进行电量消耗分析和电源管理诊断的工具,其主页位于Intel 开源技术中心的https://https://www.wendangku.net/doc/105253830.html,/powertop/,维护者是Arjan van de Ven和Kristen Accardi。PowerTop可分析系统中软件的功耗以便找到功耗大户,也可显示系统中不同的C状态(与CPUIdle 驱动对应)和P状态(与CPUFreq驱动对应)的时间比例,采用了基于TAB的界面风格,如图10.5。

图19.5 PowerTOP

5.Regulator驱动

Regulator是Linux系统中电源管理的基础设施之一,用于稳压电源的管理,是各种驱动子系统中设置电压的标准接口。前面介绍的CPUFreq驱动就经常使用它来设定电压,比如代码清单19.2的57-59行。

而Regulator则可以管理系统中的供电单元即稳压器(如LDO,即low dropout regulator,低压差线性稳压器),并提供获取和设置这些供电单元电压的接口。一般在ARM电路板上,各个稳压器和设备会形成一个供电树形结构,如图19.6所示。

图19.6 Regulator树型结构

Linux的Regulator子系统提供如下API用于注册/注销一个稳压器:

struct regulator_dev * regulator_register(const struct regulator_desc *regulator_desc, const struct regulator_config *config);

void regulator_unregister(struct regulator_dev *rdev);

regulator_register()函数的2个参数分别是regulator_desc结构体和regulator_config结构体的指针。

regulator_desc结构体是对这个稳压器属性和操作的封装,如代码清单19.7。

代码清单19.7 regulator_desc结构体

01 struct regulator_desc {

02 const char *name; /* regulator的名字 */

03 const char *supply_name; /* regulator supply的名字 */

04 int id;

05 unsigned n_voltages;

06 struct regulator_ops *ops;

07 int irq;

08 enum regulator_type type; /* 是电压还是电流Regulator */

09 struct module *owner;

10

11 unsigned int min_uV; /* 线性映射情况下最低的selector的电压 */

12 unsigned int uV_step; /* 线性映射情况下每步增加/减小的电压 */

13 unsigned int ramp_delay; /* 电压改变后稳定下来所需时间 */

14

15 const unsigned int *volt_table; /* 基于表映射情况下的电压映射表 */

16

17 unsigned int vsel_reg;

18 unsigned int vsel_mask;

19 unsigned int enable_reg;

20 unsigned int enable_mask;

21 unsigned int bypass_reg;

22 unsigned int bypass_mask;

23

24 unsigned int enable_time;

25 };

上述结构体中的regulator_ops指针ops是对这个稳压器硬件操作的封装,其中包含获取、设置电压等的成员函数,如代码清单19.8。

代码清单19.8 regulator_ops结构体

01 struct regulator_ops {

02 /* enumerate supported voltages */

03 int (*list_voltage) (struct regulator_dev *, unsigned selector);

04

05 /* get/set regulator voltage */

06 int (*set_voltage) (struct regulator_dev *, int min_uV, int max_uV,

07 unsigned *selector);

08 int (*map_voltage)(struct regulator_dev *, int min_uV, int max_uV);

09 int (*set_voltage_sel) (struct regulator_dev *, unsigned selector);

10 int (*get_voltage) (struct regulator_dev *);

11 int (*get_voltage_sel) (struct regulator_dev *);

12

13 /* get/set regulator current */

14 int (*set_current_limit) (struct regulator_dev *,

15 int min_uA, int max_uA);

16 int (*get_current_limit) (struct regulator_dev *);

17

18 /* enable/disable regulator */

19 int (*enable) (struct regulator_dev *);

20 int (*disable) (struct regulator_dev *);

21 int (*is_enabled) (struct regulator_dev *);

22

23 …

24 };

在drivers/regulator目录下,包含大量的电源芯片对应的Regulator驱动,如Dialog的DA9052、Intersil的ISL6271A、ST-Ericsson的TPS61050/61052、Wolfon的WM831x系列等,它同时提供了一个dummy的Regulator驱动作为参考,如代码清单19.9。

代码清单19.9 dummy的regulator驱动

01 struct regulator_dev *dummy_regulator_rdev;

02 static struct regulator_init_data dummy_initdata;

03 static struct regulator_ops dummy_ops;

04 static struct regulator_desc dummy_desc = {

05 .name = "regulator-dummy",

06 .id = -1,

07 .type = REGULATOR_VOLTAGE,

08 .owner = THIS_MODULE,

09 .ops = &dummy_ops,

10 };

11

12 static int __devinit dummy_regulator_probe(struct platform_device *pdev)

13 {

14 struct regulator_config config = { };

15 int ret;

16

17 config.dev = &pdev->dev;

18 config.init_data = &dummy_initdata;

19

20 dummy_regulator_rdev = regulator_register(&dummy_desc, &config);

21 if (IS_ERR(dummy_regulator_rdev)) {

22 ret = PTR_ERR(dummy_regulator_rdev);

23 pr_err("Failed to register regulator: %d\n", ret);

24 return ret;

25 }

26

27 return 0;

28 }

Linux的Regulator子系统提供消费者(Consumer)API以便让其他的驱动获取、设置、关闭和使能稳压器:

struct regulator * regulator_get(struct device *dev, const char *id);

struct regulator * devm_regulator_get(struct device *dev, const char *id);

struct regulator *regulator_get_exclusive(struct device *dev, const char *id);

void regulator_put(struct regulator *regulator);

void devm_regulator_put(struct regulator *regulator);

int regulator_enable(struct regulator *regulator);

int regulator_disable(struct regulator *regulator);

int regulator_set_voltage(struct regulator *regulator, int min_uV, int max_uV);

int regulator_get_voltage(struct regulator *regulator);

这些消费者API的地位大致与GPIO子系统的gpio_request()、Clock子系统的clk_get()、dmaengine子系统的dmaengine_submit()等相当,属于基础设施。

6.OPP

当今的SoC一般包含很多集成的组件,在系统运行过程中,并不需要所有的模块都运行于最高频率和最高性能。在SoC内,某些domain可以运行在较低的频率和电压,而其他domain可以运行在较高的频率和电压,某个domain所支持的<频率,电压>对的集合被称为Operating Performance Point(缩写为OPP)。

int opp_add(struct device *dev, unsigned long freq, unsigned long u_volt);

目前,TI OMAP CPUFreq驱动的底层就使用了OPP这种机制来获取CPU所支持的频率和电压列表。在开机的过程中,TI OMAP4芯片会注册针对CPU设备的OPP表(代码位于arch/arm/mach-omap2/),如代码清单19.10。

代码清单19.10 TI OMAP4 CPU的OPP表

01 static struct omap_opp_def __initdata omap44xx_opp_def_list[] = {

02 /* MPU OPP1 - OPP50 */

03 OPP_INITIALIZER("mpu", true, 300000000, OMAP4430_VDD_MPU_OPP50_UV),

04 /* MPU OPP2 - OPP100 */

05 OPP_INITIALIZER("mpu", true, 600000000, OMAP4430_VDD_MPU_OPP100_UV),

06 /* MPU OPP3 - OPP-Turbo */

07 OPP_INITIALIZER("mpu", true, 800000000, OMAP4430_VDD_MPU_OPPTURBO_UV),

08 /* MPU OPP4 - OPP-SB */

09 OPP_INITIALIZER("mpu", true, 1008000000, OMAP4430_VDD_MPU_OPPNITRO_UV),

10 …

11 };

12 /**

13 * omap4_opp_init() - initialize omap4 opp table

14 */

15 int __init omap4_opp_init(void)

16 {

17 …

18 r = omap_init_opp_table(omap44xx_opp_def_list,

19 ARRAY_SIZE(omap44xx_opp_def_list));

20

21 return r;

22 }

23 device_initcall(omap4_opp_init);

24 int __init omap_init_opp_table(struct omap_opp_def *opp_def,

25 u32 opp_def_size)

26 {

27 …

28 /* Lets now register with OPP library */

29 for (i = 0; i < opp_def_size; i++, opp_def++) {

30 …

31 if (!strncmp(opp_def->hwmod_name, "mpu", 3)) {

32 /*

33 * All current OMAPs share voltage rail and

34 * clock source, so CPU0 is used to represent

35 * the MPU-SS.

36 */

37 dev = get_cpu_device(0);

38 } …

39 r = opp_add(dev, opp_def->freq, opp_def->u_volt);

40 …

41 }

42 return 0;

43 }

针对device结构体指针dev对应的domain增加一个新的OPP,参数freq和u_volt即为该OPP对应的频率和电压。

int opp_enable(struct device *dev, unsigned long freq);

int opp_disable(struct device *dev, unsigned long freq);

上述API用于使能和禁止某个OPP,一旦被disable,其available将成为false,之后有设备驱动想设置为这个OPP就不再可能了。譬如,当温度超过某个范围后,系统不允许1GHz 的工作频率,可采用类似代码:

if (cur_temp > temp_high_thresh) {

/* Disable 1GHz if it was enabled */

rcu_read_lock();

opp = opp_find_freq_exact(dev, 1000000000, true);

rcu_read_unlock();

/* just error check */

if (!IS_ERR(opp))

ret = opp_disable(dev, 1000000000);

else

goto try_something_else;

}

上述代码中调用的opp_find_freq_exact()用于寻找与一个确定频率和available匹配的OPP,其原型为:

struct opp *opp_find_freq_exact(struct device *dev, unsigned long freq,

bool available);

另外,Linux还提供2个变体,opp_find_freq_floor()用于寻找1个OPP,它的频率向上接近或等于指定的频率;opp_find_freq_ceil()用于寻找1个OPP,它的频率向下接近或等于指定的频率,这2个函数的原型为:

struct opp *opp_find_freq_floor(struct device *dev, unsigned long *freq);

struct opp *opp_find_freq_ceil(struct device *dev, unsigned long *freq);

我们可用下面的代码分别寻找1个设备的最大和最小工作频率:

freq = ULONG_MAX;

rcu_read_lock();

opp_find_freq_floor(dev, &freq);

rcu_read_unlock();

freq = 0;

rcu_read_lock();

opp_find_freq_ceil(dev, &freq);

rcu_read_unlock();

在频率降低的同时,其支撑该频率运行所需的电压也往往可以动态调低;反之,则可能需要调高,下面这2个API分别用于获取某OPP对应的电压和频率:

unsigned long opp_get_voltage(struct opp *opp);

unsigned long opp_get_freq(struct opp *opp);

举个例子,当某CPUFreq驱动想将CPU设置为某一频率的时候,它可能会同时设置电压,其代码流程为:

soc_switch_to_freq_voltage(freq)

{

/* do things */

rcu_read_lock();

opp = opp_find_freq_ceil(dev, &freq);

v = opp_get_voltage(opp);

rcu_read_unlock();

if (v)

regulator_set_voltage(.., v);

/* do other things */

}

如下简单的API可用于获取某设备所支持的OPP的个数:

int opp_get_opp_count(struct device *dev);

前面提到,TI OMAP CPUFreq驱动的底层就使用了OPP这种机制来获取CPU所支持的频率和电压列表。它在omap_init_opp_table()函数中添加了相应的OPP,在TI OMAP芯片的CPUFreq驱动drivers/cpufreq/omap-cpufreq.c中,则借助了快捷函数opp_init_cpufreq_table()来依据前面注册的OPP建立CPUFreq的频率表:

static int __cpuinit omap_cpu_init(struct cpufreq_policy *policy)

{

if (!freq_table)

result = opp_init_cpufreq_table(mpu_dev, &freq_table);

}

而在CPUFreq驱动的target成员函数omap_target()中,则使用OPP相关的API来获取了频率和电压:

static int omap_target(struct cpufreq_policy *policy,

unsigned int target_freq,

unsigned int relation)

{

if (mpu_reg) {

opp = opp_find_freq_ceil(mpu_dev, &freq);

volt = opp_get_voltage(opp);

}

}

drivers/cpufreq/omap-cpufreq.c相对来说较为规范,它在<频率,电压>表方面底层使用了OPP,在设置电压的时候又使用了规范的Regulator API。

比较新的驱动一般不太喜欢直接在代码里面固话OPP表,而是喜欢在相应的结点添加operating-points属性,如imx27.dtsi中的:

cpus {

#size-cells = <0>;

#address-cells = <1>;

cpu: cpu@0 {

device_type = "cpu";

compatible = "arm,arm926ej-s";

operating-points = <

/* kHz uV */

266000 1300000

399000 1450000

>;

clock-latency = <62500>;

clocks = <&clks IMX27_CLK_CPU_DIV>;

voltage-tolerance = <5>;

};

};

如果CPUFreq的变化可以使用非常标准的regulator、clk API,我们甚至可以直接使用drivers/cpufreq/cpufreq-dt.c这个驱动。这样只需要在CPU结点上填充好频率电压表,然后在平台代码里面里面注册cpufreq-dt设备就可以了,arch/arm/mach-imx/imx27-dt.c、arch/arm/mach-imx/mach-imx51.c中可以找到类似的例子:

static void __init imx27_dt_init(void)

{

struct platform_device_info devinfo = { .name = "cpufreq-dt", };

of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);

platform_device_register_full(&devinfo);

}

7.PM QoS

Linux内核的PM QoS系统针对内核和应用程序提供了一套接口,透过这个接口,用户可以设定自身对性能的期望。一类是系统级的需求,透过cpu_dma_latency, network_latency, network_throughput这些参数来设定;一类是单个设备可以根据自身的性能需求发起per-device的PM QoS请求。

在内核空间,通过pm_qos_add_request()函数可以注册PM QoS 请求:

void pm_qos_add_request(struct pm_qos_request *req,

int pm_qos_class, s32 value);

通过pm_qos_update_request() 函数可以更新已注册的PM QoS 请求:

void pm_qos_update_request(struct pm_qos_request *req,

s32 new_value);

void pm_qos_update_request_timeout(struct pm_qos_request *req, s32 new_value,

unsigned long timeout_us);

通过pm_qos_remove_request()函数可以删除已注册的PM QoS 请求:

void pm_qos_remove_request(struct pm_qos_request *req);

譬如在drivers/media/platform/via-camera.c这个摄像头驱动中,当摄像头开启后,通过如下语句可以阻止CPU进入C3级别的深度IDLE:

static int viacam_streamon(struct file *filp, void *priv, enum v4l2_buf_type t) {

pm_qos_add_request(&cam->qos_request, PM_QOS_CPU_DMA_LATENCY, 50);

}

这是因为,在CPUIdle子系统中,会根据PM_QOS_CPU_DMA_LATENCY请求的情况选择合适的C状态,如drivers/cpuidle/governors/ladder.c中的ladder_select_state()就会判断目标C状态的exit_latency与QoS要求的关系,如代码清单19.11。

代码清单19.11 CPUIdle LADDER governor对QoS的判断

01 static int ladder_select_state(struct cpuidle_driver *drv,

02 struct cpuidle_device *dev)

03 {

04 …

05 int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);

06

07 …

08

09 /* consider promotion */

10 if (last_idx < drv->state_count - 1 &&

11 !drv->states[last_idx + 1].disabled &&

12 !dev->states_usage[last_idx + 1].disable &&

13 last_residency > last_state->threshold.promotion_time &&

14 drv->states[last_idx + 1].exit_latency <= latency_req) {

15 last_state->stats.promotion_count++;

16 last_state->stats.demotion_count = 0;

17 if(last_state->stats.promotion_count>=

18 last_state->threshold.promotion_count) {

19 ladder_do_selection(ldev, last_idx, last_idx + 1);

20 return last_idx + 1;

21 }

22 }

23 …

24 }

LADDER在选择是否进入更深层次的C状态时,会比较C状态的exit_latency要小于透过pm_qos_request(PM_QOS_CPU_DMA_LATENCY)得到的PM QoS请求的延迟,见第14行。

同样的逻辑也出现于drivers/cpuidle/governors/menu.c中,如代码清单19.12的第18~19行。

代码清单19.12 CPUIdle MENU governor对QoS的判断

01 static int menu_select(struct cpuidle_driver *drv, struct cpuidle_device *dev)

02 {

03 struct menu_device *data = &__get_cpu_var(menu_devices);

04 int latency_req = pm_qos_request(PM_QOS_CPU_DMA_LATENCY);

05 …

06 /*

07 * Find the idle state with the lowest power while satisfying

08 * our constraints.

09 */

10 for (i = CPUIDLE_DRIVER_STATE_START; i < drv->state_count; i++) {

11 struct cpuidle_state *s = &drv->states[i];

12 struct cpuidle_state_usage *su = &dev->states_usage[i];

13

14 if (s->disabled || su->disable)

边疆危机与甲午中日战争

边疆危机与甲午中日战争 教学目标 1.甲午中日战争的爆发;左宝贵与平壤战役;邓世昌与黄海战役;旅顺陷落;丁汝昌与威海卫战役;中日《马关条约》的主要内容及影响;帝国主义经济侵略的加剧和瓜分狂潮。 2.甲午中日战争是日本帝国主义为吞并朝鲜、入侵中国而蓄意挑起的侵略战争。在战争中,以左宝贵、邓世昌等为代表的广大爱国官兵进行了英勇顽强的反侵略斗争,他们是中华民族的英雄。通过对课文的学习,进一步认清政治制度的腐败是导致战争失败的主要原因,中日《马关条约》的签订,大大加深了中国社会的半殖民地化。甲午中日战争以后,帝国主义对中国的经济侵略加剧,掀起瓜分中国的狂潮,中国的民族危机空前严重。 3.通过深入探讨甲午战争的影响,锻炼学生的思维能力。培养学生运用资料分析历史问题、评价历史人物的能力。引导学生分析甲午战争清军战败的原因,培养学生分析问题的能力 教学建议 地位分析 甲午战争是中华民族历史上一次深重的民族灾难,它给中国人民带来了前所未有的耻辱,大大加深了中国社会的半殖民地化。它上承两次鸦片战争,但损失之惨重超过了鸦片战争以来历次外祸之总和;下启帝国主义瓜分中国的狂潮,在这以后中国更为全方位地被迫开放,并且相继受到大规模的军事侵略,是民族危机最严重的时期。清王朝衰朽不堪、积贫积弱现象彻底暴露,亡国之祸迫在眉睫。也正是这场战争,促成了自鸦片战争以来前所未有的民族觉醒,危机也是转机。因此本课在教材中的地位举足轻重,让初中学生深入认识甲午战争这一重大历史事件并从中吸取教训是非常必要的。 导入法 本课可利用计算机显示一副富有趣味的对联进入新课。上联是:“内无相,外无将,不得已玉帛相将”,作者是甲午中日战争的主要策划者、日本内阁首相伊藤博文(出示伊藤照片),当他把这副上联拿给前去日本谈判的李鸿章(出示李鸿章照片),要求李鸿章对出下联时,这位清政府中举足轻重的人物思考良久,终于勉强想出下联:“天难度,地难量,这才是帝王度量”。当这副对联在屏幕上显示后,提出问题:(1)对联中哪句话反映了当时清政府的状况? (2)“玉帛相将”是什么意思?学生回答后,教师设问:为什么在甲午战争中,清政府落得如此惨败,只得“玉帛相将”,具有“帝王度量”的慷慨大方? 由此导入新课。 《马关条约》的影响 《马关条约》的影响是教学难点。首先要明确签订的历史背景。不仅要认识到大背景(即19世纪末日本开始向帝国主义过渡),还要认识到小背景(即甲午中日战争中中国战败),这是解决这个难点的前提。其次,引导学生思考:为什么要割占台湾?为什么要赔偿军费白银多达2亿两?为什么开放通商口岸直达重庆?为什么新增允许在通商口岸设厂的规定?再次,要引导学生进一步思考《马关条约》与以前条约的规定有哪些相同、哪些不同点,从而理解《马关条约》所具有的明显的时代烙印,认识帝国主义瓜分世界、资本输出的本质。最后,让学生在逐一进行透彻分析的基础上,结合时代背景,层层递进、环环相扣地运用归纳法分析《马关条约》的影响。

中国思想古代智慧与现代科学 (21)

Lecture 8: New Insights from the Earth: The Guodian Laozi

?typically on bamboo ?sometimes silk, paper (Mawangdui, Dunhuang) ! ?typically from tombs ?sometimes religious sites (Dunhuang caves)?best of both worlds (received vs. archeological)

?esp. since middle of 20th century have been revolutionizing our understanding of early China ?law ?everyday life of common people ?medicine ?philosophy and religion

Guodian find ?unearthed in 1993 in Guodian (Hubei), near former Chu capital

? ?unearthed in 1993 in Guodian (Hubei), near former Chu capital ?sealed by 300 B.C.E. or so Guodian find

?unearthed in 1993 in Guodian (Hubei), near former Chu capital ?sealed by 300 B.C.E. or so ? large cache of philosophical texts Guodian find

一个中国孩子的呼声

《一个中国孩子的呼声》教学设计 教学目标】 1.认识7个生字,会写14个生字。正确读写有关词语。 2.理解信的主要内容,体会作者表达的真挚情感,树立热爱和平、维护和平的信念。 3.理解含义深刻句子的意思。 4.有感情地朗读课文。 【教学重点】 a、理解信的主要内容,体会作者表达的真挚情感. b、学习理解含义深刻句子的方法。 【教学准备】 课前预习课文,收集有关战争方面的资料。 【课时安排】两课时。 【教学过程】 第一课时 教学过程: 一、谈话导入 1、出示图片。 今天,老师给大家带来几幅图片,大家想看吗?(出示幸福的一家人漫步街头的图片)看,沐浴着和煦的阳光,一家人漫步在街头,一路谈笑风生,其乐融融,多么幸福的一家人啊!(出示战争图片)再看,炮火连天,人们被迫离开自己的家园,年轻的生命转瞬即逝。同学们,看了这些图片,你想说些什么? 预设:A、和平多美好啊!B、战争夺去了许多人的生命。C、战争太可怕了!D、我们要和平,不要战争。…… 2、谈话引题。 大家说的真好!战争是残酷的,它充满了血腥。今天就让我们走近一个被战争夺去父亲生命的孩子,去感受他的内心世界,聆听他的呼声。我们就来学习第15课《一个中国孩子的呼声》,板书课题,齐读课题。 二、初读课文,概括课文主要内容。 师:课文是一个失去父亲的中国孩子雷利写给联合国秘书长加利先生的一封信,大家想知道这封信的内容吗? 1、要求:同学们自由朗读课文,读课文时读准字音,并思考雷利在信中写了些什么? 2、检查生字读音。 师:课文读完了,你能读准字音吗? 卓越蓝盔凯旋手腕弥漫威胁征衣圣坛罪恶 鲜血凝固的血永驻人间健康丧钟给予 (关注:平翘舌音,以及血、丧、给的读音) 3、概括课文主要内容。 导语:同学们读准了字音,读完了课文,你知道雷利在信中写了什么吗? 预设:A、雷利的爸爸牺牲了。B、雷利在信中呼吁和平C、雷利非常怀念自己的爸爸。D、雷利希望明天充满阳光。…… 小结:同学们的读书收获真不少!通过读课文我们知道了雷利在信中深切缅怀自己的父亲,

中国古代科学思想史复习题库

一、什么是“李约瑟难题”?对此,你怎样看? 关于“李约瑟难题”,通常有两种表述形式:1.古代中国人在科学和技术方面曾经有过辉煌,其发达的程度远远超过同时期的欧洲,原因是什么? 2.是 why not(为什么不)式的,为什么近代科学或者说科学革命没有产生在中国,而是在17世纪的西方,特别是文艺复兴之后的欧洲?就我看来,“李约瑟难题”似乎只问对了一半。在技术——经验领域或实用技术方面,中国古代可能是领先于同时代的西方;但在科学——理论、思想和方法方面,中国古代未必就超越于西方。因为技术的水平和应用具有一定的可比性,而科学由于发生的文化多样性就很难进行通约。 二、举例说明,中国古代科学与艺术的一体融合。 1.太原双塔地处太原高地,环境的自然消雷有限,塔身高耸的尖顶加上各层出檐也仅有一定的消雷能力,但还远不足以避雷。然而,双塔在近400年的岁月里从未遭受过雷击。这是因为,双塔本身具有良好的绝缘性能。双塔地处地质干燥的高地,塔身不着雨淋,又兼全砖石结构,在雷雨天近乎绝缘体,这就像今天输电线路中的大悬垂串一样。可以说,太原双塔是依靠建筑物本身的绝缘性起主要作用而避雷的,这形象地体现了科学与艺术的一体融合。 2.黄河蒲津渡铁牛浮桥,举世称奇,是科学与艺术的一体融合的典型代表。看那4尊铁牛,小者50吨,大者70吨,个个赛过沧州大铁狮。河中设河心洲,减缓水的冲击,桥便一分为二。河心洲缩短了桥身,桥的重心也有了着落。这是向下游弯曲的舟桥,而非直桥,弯曲的浮梁利于减轻水流冲击,类似今天的斜拉桥。铁牛及七星柱,还组成一个完整的文化系统。七星柱的布局,反映了北斗七星的方位。铁牛与七星柱摆在一起,折射出中国古代的自然观。 3.我国北宋文学家苏轼著《前赤壁赋》,从“月出于东山之上”写起,由月的明朗,衬托出山川的阔大;由箫声回荡,共鸣着历史的怨诉。在一览历史的镜子、寄情怀古感今之际,苏子居然能把思路一转,引出关于天地、主客、时空、物质和运动守恒变化的的精辟论辩。 三、沈括在中国科技史上有哪些贡献? 1. 创“十二气历”,一种先进、合理的历法。 2. 比欧洲早5个世纪发现了地磁偏角的存在。 3. 写成了不朽名著《梦溪笔谈》,详细记载了劳动人民在科学技术方面的卓越贡献和他自己的研究成果,反映了我国古代特别是北宋时期自然科学达到的辉煌成就。 4. 总结出了二阶等差级数的求和方法——隙积术。 5. 提出了我国数学史上第一个由弦和矢的长度求弧长的比较简单实用的近似公式——会圆术。 四、请举例说明宋元时期是中国科技发展的一个高峰。 1.四大发明中有三大发明(印刷术、指南针、火药)在宋元时期。 2.北宋沈括著《梦溪笔谈》,记叙了我国古代许多科技成就,也包括沈括自己的不少科学创见,反映了我 国古代特别是北宋时期自然科学达到的辉煌成就。 3.北宋建筑师李诫著《营造法式》,集中说明了我国古代建筑技术已进入成熟阶段,它是我国古代最全面、 最科学的建筑手册,也是世界上最早最完备的建筑学著作。 4.元朝郭守敬编《授时历》,这历法共施行了364年,是我国古代最精密、使用时间最长的历法。 5.元朝农学家王祯的《农书》是我国第一部系统研究农学的著作。 五、魏晋南北朝时期,中国科学技术有哪些亮点? 1. 魏晋时期数学家刘徽撰成《九章算术注》,提出了计算圆周率的正确方法——割圆术,为计算圆周率和其他相关问题建立起相当严密的理论和完善的算法。 2.南北朝时期祖冲之进一步精确推算了圆周率,这在世界科技史上千年无人超越。

四年级语文下册第十五课一个中国孩子的呼声句子赏析

四年级语文下册第十五课一个中国孩子的呼声句子赏析 ⑴孩子,等爸爸回来,我一定送你一顶‘蓝盔’。 维和部队士兵均统一着蓝色盔帽或蓝色贝雷帽,上有联合国英文缩写“UN”,臂章缀 有“地球与橄榄枝”图案,亦称“蓝盔”部队蓝色象征和平。这里看出爸爸对这次去执行 联合国维和行动充满信心,同时也表达了他对和平的希冀与向往。 ⑵鲜血染红了他的征衣,腕上的手表浸满了凝固的血。 从血染的征衣及浸满血的手表这两处细节描写,看出爸爸以身殉职,牺牲壮烈,同时 也表达了我痛失爸爸后极其悲痛的心情。 ⑶爸爸的嘴张着,仿佛在呼唤着什么。 “爸爸”仿佛在呼唤什么?联系上下文便可清楚地知道,“爸爸”在呼唤和平,在呼 唤人们捍卫和平。英雄牺牲时仍不忘和平,这一细节描写更加深刻地表现了爸爸以及我们 对和平充满渴望。 ⑷一名卓越的观察员,在执行联合国维和行动中体现了人道主义的素质。 他的死是光荣的,他是为和平而倒下的,他倒在了维护世界和平的圣坛上。加利对“我”爸爸的高度评价以及“我”对爸爸的介绍,所有这些都说明爸爸为和平事业宁可舍 弃一切,他是个很优秀的维和战士,他热爱和平,勇敢地用自己的生命保卫和平。 ⑹但是世界并不太平,不少地区还弥漫着战争的硝烟,罪恶的子弹还威胁着娇嫩的 ‘和平之花’。 这句话的意思是说:只要有局部的战争存在,整个世界就难保太平。只要有罪恶的子 弹存在,这“和平之花”虽然美丽,却容易被摧残。所以,和平需要全世界人民共同捍卫。 ⑺让那已经能够听到脚步声的21世纪,为战争敲响丧钟,让明天的世界真正成为充 满阳光、鲜花和爱的人类家园! 这句话饱含着一个失去亲人的孩子对和平无比渴望的真挚情感,同时也表达了中国孩 子向国际社会呼吁“救救孩子,要和平不要战争”的心声。 这篇课文属书信体文章,是一个中国孩子写给联合国秘书长加利的一封信。这封信首 先表达了“我”和妈妈对加利先生的问候和深深的谢意,接着深情回忆“我”的爸爸出征 前后的情景,在悲痛中怀着自豪和崇敬,并表示要向爸爸学习,用生命捍卫和平。最后, 呼吁国际社会一致行动起来,维护和平,制止战争!

四年级语文:一个中国孩子的呼声(教学方案)

小学语文标准教材 四年级语文:一个中国孩子的呼声(教学方案) People need to communicate and communicate with each other, and language is the bridge of human communication and the link. 学校:______________________ 班级:______________________ 科目:______________________ 教师:______________________

--- 专业教学设计系列下载即可用 --- 四年级语文:一个中国孩子的呼声(教学方 案) [教学目标] 1.指导学生会认 7 个生字,会写 14 个生字。 2.指导学生有感情地朗读课文。 3.指导学生理解本文的主要内容,体会作者所表达的真挚情感。 4.指导学生能联系实际谈自己学习课文的感受,树立热爱和平、维护和平的信念。 5.指导学生理解含义深刻的句子。 [重点难点] 1.教学重点:指导学生理解文中“我”的呼吁,体会“我”对

父亲的深切怀念、对和平的无比渴望。 2.教学难点:指导学生理解“世界并不太平,不少地区还弥漫着战争的硝烟,罪恶的子弹还威胁着娇嫩的‘和平之花’”,树立维护和平的观念。 [课时安排] 2 课时 [教学过程] 第一课时 一、课题导入 看课题:一个中国孩子的呼声。看到课题,你有什么问题?预设:这个中国孩子是谁?他发出什么呼声?他为什么要发出这样的呼声? 二、有感情地范读,引导学生入情 三、重点学习第二部分 1.请同学们快速朗读课文,读完后想一想:信的主要内容是什么?它着重写了什么? 2.请同学们重点朗读课文第二至第四自然段,想一想:这几段

边疆危机与甲午中日战争同步试题

边疆危机与甲午中日战争 同步试题 The document was prepared on January 2, 2021

华师大版八年级历史上册同步训练第2课边疆危机与甲午中日战争 参谋意见 左宗棠收复新疆和甲午中日战争中邓世昌的事迹,反映了中国人民反抗外国侵略的民族气节和斗争精神,同学们要继承和发扬中华民族保家为国的优良传统;还要通过甲午中日战争以“泱泱大国”自居的清王朝败给“弥睨岛国”日本的史实,增强忧患意识,明白“落后就要思进”.“落后就要思变”的道理。 自学流程 1.历史进入19世纪70年代中国边疆为什么又起波澜? 世纪70年代中国边疆危机主要表现在哪些方面? 3.决心“亲自舆榇出关,誓与俄人决死一战”的人是谁? 世纪70年代日本曾将侵略魔掌伸向我国的什么地方之后,又将魔掌伸向哪一个邻国目的何在 5.“弥睨岛国”日本,曾与中国遭遇相似,为什么19世纪70年代后,反将魔掌伸向 我国? 6.《马关条约》的签定,对中国造成的影响有哪些? 7.为什么说甲午战败使群体意义的中华民族开始觉醒? 同步训练 一、单项选择 世纪70年代,率军收复新疆的钦差大臣是() A.曾国藩 B.曾纪泽 C.左宗棠 D.李鸿章 2.甲午中日战争爆发的标志性事件是() A.清政府出兵朝鲜,帮助镇压东学党起义 B.日本海军在朝鲜牙山口外丰岛海面偷袭清军运兵船 C.日本围攻平壤 D.日军进攻旅顺、大连 3.《马关条约》中没有涉及的问题是() A.领土问题 B.赔款问题 C.开埠问题 D.宗教问题 4.在黄海战役中,志远舰管带壮烈捐躯,他是() A.冯子材 B.邓世昌 C.丁汝昌 D.左宗棠 5.造成北洋舰队全军覆没的主要原因是() A.李鸿章避战自保 B.前线将领指挥不利 C.日军实力过于强大 D.清军战斗力差,献船投敌 二、材料分析 读右图,请回答: (1)右图中的人物是谁?

2018年中考历史(福建专版)总复习练习:主题05 中国古代的科学技术与思想文化

主题05中国古代的科学技术与思想文化 1. (17模拟)孔子被尊奉为世界十大文化名人和十大思想家之一,他创立了(D) A. 法家学派 B. 道家学派 C. 墨家学派 D. 儒家学派 2. (17模拟)孔子的言论有助于构建和谐人际关系的思想主张是(A) A. “仁” B. “因材施教” C. “知之为知之” D. “温故而知新” 3. (17模拟)孔子有关和谐社会的主张是(A) A. “仁”“爱人” B. 提倡法治 C. 无为而治 D. “兼爱”“非攻” 4. (17模拟)《后汉书》记载,汉和帝元兴元年(公元105年),东汉宦官蔡伦的造纸术得 到朝廷推广。这一历史事件的时间采用世纪纪年,应是(B) A. 1世纪初 B. 2世纪初 C. 1世纪末 D. 2世纪末 5. (17模拟)培根对于中国古代的发明曾说:“……发明首先在文字方面,其次在战争方 面,第三在航海方面,改变了整个世界许多事物的面貌和状态……”他说的第二种发明指的是(D) A. 指南针 B. 造纸术 C. 印刷术 D. 火药 6. (17模拟)被称为“航海的眼睛”的伟大发明是(C) A. 造纸术 B. 印刷术 C. 指南针 D. 火药 7. (17赤峰)在中国古代,宋朝是一个前所未有的发展创新和文化繁盛时期。下列各项能 体现宋朝“发展创新和文化繁盛”的是(C) A. 出现中国最早的纸 B. 发明了火药 C. 发明了活字印刷术 D. 形成了诗歌创作的繁荣局面 8. (17模拟)右图著作(B) A. 是我国最早一部医学著作 B. 奠定了中医治疗学的基础

C. 记载了“麻沸散”的研制 D. 被誉为“东方医学巨典” 9. 在我国古代,有一项被西方国家称为“东方医学巨典”的著作,它是(D) A. 《天工开物》 B. 《齐民要术》 C. 《农政全书》 D. 《本草纲目》 10. (17模拟)第一手史料指接近或直接在历史事件发生时所产生和记录的原始资料。以 下适用于研究秦朝历史的第一手史料是(B) A. 电视剧《大秦帝国》 B. 秦长城遗址 C. 今人著述《秦始皇大传》 D. 司马迁《史记》 11. (17模拟)学习历史需要辨别史料的价值。从研究司马迁史学思想的角度来看,《史记》 属于(B) A. 第一手资料 B. 第二手资料 C. 口述资料 D. 影像资料 12. (17泰安六三制)《史记》的记载是我们研究黄帝的重要资料。司马迁著《史记》时, 游历各地,搜集民间关于黄帝的传说,考证文献记载、辨别文献真伪,编成黄帝的事迹列于本纪之首。这表明(B) A. 《史记》中关于黄帝的记述具有唯一性 B. 传说一定程度上能够反映历史真实 C. 口头传说不足以印证历史 D. 文献记载没有参考价值 13. (17桂林)西汉史学家司马迁开创了“论从史出”的治史方法,第一次以纪传体通史 的体例叙述了从黄帝到汉武帝时期3 000多年的历史,完成了一部不朽的史学名著。这部史学名著是(D) A. 《汉书》 B. 《后汉书》 C. 《三国志》 D. 《史记》 14. 下列哪一朝代的诗歌内容丰富、风格多样,是我国诗歌创作的黄金时代(B) A. 汉朝 B. 唐朝 C. 宋朝 D. 清朝 15. 明清时期的古典小说塑造了许多性格鲜明的人物形象。“贾宝玉”这一形象出自 (D) A. 《三国演义》 B. 《西游记》 C. 《水浒传》 D. 《红楼梦》 16. (17呼和浩特)推动道教在民间兴起的主要人物是(C) A. 老子 B. 庄子 C. 张陵 D. 汉明帝 17. (17河南)下列三幅图片共同反映了(B)

百年中国边疆危机

百年中国边疆危机 鸦片战争后,一向封闭自足的中国门户洞开,欧洲列强在英国炮舰打开的缝隙中蜂拥而入,激烈地争夺在华利益。他们在东亚的利益常常彼此冲突,以至于各驻华使节主要目的之一就是时刻观察其余列强在中国的举动,不使之侵犯到本国在华利益;而中国的内政反不在观察的重点范围之内。尽管列强都毫无尊重中国本身力量的意愿,但这种互相提防、制约也使不管哪一个大国,如果想不顾他国在华利益,独自吞并中国,都要遭到其余列强的联合反对。 1870年前后世界发生一连串重大政治变局:德国/意大利的统一和兴起、美国内战、俄罗斯在克里米亚战争失败后改革内政,并将扩张矛头从欧洲移向东方;而英法则分别忙于巩固自己的殖民地及与新兴列强竞争。1868年日本明治维新之所以能平稳成功,免遭列强干涉,与这一时代给它的运气不无关系:列强都没有腾出手来打断这个遥远列岛上的改革措施。 这一时期中国则受困于残酷内战——太平天国战争死亡人数一般估计达2000万人。随后则是短暂的“同治中兴”和地方势力的兴起。洋务运动的失败使中国体制内改革的最后希望破灭了,清王朝之后再也没有这么好的运气了。等到1880年代末,西欧列强完成欧洲的瓜分,俄国也已在1885完成对中亚的占领,现在轮到了中国。毫不奇怪,下一十年就成为列强在华激烈竞逐的时代,1890年代因而也是中国近代边疆危机最严重的时代。 在19世纪末期,没有人怀疑列强会以更粗暴的手段对待中国。继甲午战争中令人沮丧地惨败于日本后,1898年成为中国近代外交史上的大灾年,接连向俄、英、德等过割让旅大、威海、九龙、胶州湾等地。在华的列强对了自身利益,进行了一连串令人眼花缭乱的外交活动。德国为离间法俄同盟而支持俄国,而英国又支持德国1898年租借胶州湾,并且只要该地愈偏北,将愈“受英国人之欢迎”……“将使俄国独占华北沿海的局面宣告结束。”英国为阻止俄国势力过强,扶植日本,日本得到这一保证后,再无后顾之忧,1904年发动日俄战争;但战后不久,英国却出于遏制德国的目的,又于1907年与俄国结成同盟。那几年(1895-98),北京的总理衙门简直变成了交易所、公证所,经常挤满了带着译员的外交官,一连几小时、几天、几星期地在那里讨价还价,进行种种交易,核对和签署各项条约、协定、税率表、界桩和哨所清册等等,不时提高嗓门,“激动”起来,用五花八门的外交名词吓唬人,什么“郑重知照”、“严正声明”、“强烈要求”等等,目的在于以“严重后果”的前景使清朝官员产生“深刻印象”。(《日俄战争外交史纲,1895-1907》) 例如日本在甲午战争后割占辽东,性子太急了,侵犯列强利益过快,俄德法三国就联合干涉,逼它把吞进去的再吐出来。其情形恰似一群恶汉各举刀叉瓜分蛋糕,彼此提防他人,如果有人切得过大过快,旁人立刻就要反制——虽然这种反制本身是因为他自己想吃蛋糕,但至少能保全相对还算完整的蛋糕,不至于切得太快。 至于大洋彼岸的美国,当时还不是一个受尊重的势力。1895年马关条约签订后第二天,法国驻柏林大使问德国人“美国将会怎么说?”后者回答道:“不会说什么的,要知道,他们既无海军,又无陆军。”德国人用欧洲的尺度来衡量美国,这在当时是完全正确的。1900年美国提出的“门户开放、利益均沾”在客观上是调和了一点列强在华的利益,这一政策构成此后百年美国东亚政策的核心:即不使该地区出现一个排他性的力量。 当然,天真地指望“以夷制夷”也未必成功,因为互相冲突的列强利益也能自我调整。这一点在1907年尤为明显。这一年3月,日俄签署第一次密约,分别承认对方在朝鲜和外蒙古的特殊利益,而“不阻挠此种关系之继续发展”;6月又签定日法协定,相互承认在中国的势力范围;8月,英俄相互承认对方在西藏、阿富汗的利益,并就划分伊朗的势力范围达成协议。

四年级下册语文《一个中国孩子的呼声》词句解析

《一个中国孩子的呼声》词句解析【词句解析】 1、对句子的理解: ⑴孩子,等爸爸回来,我一定送你一顶‘蓝盔’。 维和部队士兵均统一着蓝色盔帽或蓝色贝雷帽,上有联合国英文缩写“UN”,臂章缀有“地球与橄榄枝”图案,亦称“蓝盔”部队(蓝色象征和平)。这里看出爸爸对这次去执行联合国维和行动充满信心,同时也表达了他对和平的希冀与向往。 ⑵鲜血染红了他的征衣,腕上的手表浸满了凝固的血。 从血染的征衣及浸满血的手表这两处细节描写,看出爸爸以身殉职,牺牲壮烈,同时也表达了我痛失爸爸后极其悲痛的心情。 ⑶爸爸的嘴张着,仿佛在呼唤着什么。 “爸爸”仿佛在呼唤什么?联系上下文便可清楚地知道,“爸爸”在呼唤和平,在呼唤人们捍卫和平。英雄牺牲时仍不忘和平,这一细节描写更加深刻地表现了爸爸以及我们对和平充满渴望。 ⑷一名卓越的观察员,在执行联合国维和行动中体现了人道主义的素质。 他的死是光荣的,他是为和平而倒下的,他倒在了维护世界和平的圣坛上。加利对“我”爸爸的高度评价以及“我”对爸爸的介绍,所有这些都说明爸爸为和平事业宁可舍弃一切,他是个很优秀的维和战士,他热爱和平,勇敢地用自

己的生命保卫和平。 ⑹但是世界并不太平,不少地区还弥漫着战争的硝烟,罪恶的子弹还威胁着娇嫩的‘和平之花’。 这句话的意思是说:只要有局部的战争存在,整个世界就难保太平。只要有罪恶的子弹存在,这“和平之花”虽然美丽,却容易被摧残。所以,和平需要全世界人民共同捍卫。 ⑺让那已经能够听到脚步声的21世纪,为战争敲响丧钟,让明天的世界真正成为充满阳光、鲜花和爱的人类家园! 这句话饱含着一个失去亲人的孩子对和平无比渴望的真挚情感,同时也表达了中国孩子向国际社会呼吁“救救孩子,要和平不要战争”的心声。 2、对词语的理解: 卓越:非常优秀,超出一般。 凯旋:战胜归来。 弥漫:(烟尘、雾气、水等)充满、布满。这里指战火还充满着一些地区。 硝烟:炸药爆炸后产生的烟雾。 威胁:用威力逼迫恫吓使人屈服。 呼吁:向个人或社会申述,请求援助或主持公道。

人民版高中历史必修三复习题:21中国古代的科学技术.docx

1.由于种种原因,中国古代的许多发明往往局限在它的发源地,推广极慢。但两宋时期,技术发明的推广速度明显加快C如发明于北宋的犁刀,到南宋时已经成为江南各地开荒的必备工具。根据所学知识判断,两宋吋技术发明“推广速度明显加快”最可能的原因是() A.印刷业的蓬勃发展 B.指南针的应用 C.造纸术的发明 D.科举制的扩大 2.“伦乃造意,用树肤、麻头及敝布、渔网以为纸。”这是《后汉书》中有关我国古代一项重大科技成就的记载。这项科技成就的取得起到的历史作用是() A.推动古代中国纺织业的进一步发展 B.促成了新航路开辟和世界市场的形成 C.帮助欧洲资产阶级战胜了骑士阶层 D.导致信息记录与传播技术的革命性进步 3.宋朝是当时世界上最大、生产力最高和最发达的国家,但是由于种种不利因素的影响,这一发展势头未能继续下去。“种种不利因素”包括() ①传统政治体制的束缚②科技没有突破传统科技的藩篱(或没有形成近代科技) ③理学的束缚④小农经济一直占据主导地位 A.①②③ B.①②④ C.①③④ D.①②③④ 4.有学者说“中国历史上较为发达的科学领域和技术部门,大都带有官营的印记,与国家的治理息息相关”,“屮国古代科技固然成绩突出,但这些成果在技术方面停滞于农业和手工业的经验工艺的水平上,在理论上始终贯穿着天人合一的思想,以变幻莫测的道、气等概念來建构学术体系……混有大量的荒诞不经的反科学的成分”。这说明() A.古代科技注重实用但缺乏理性 B.天人合一思想阻碍科技发展 C.古代中国科技屮没有科学理论 D.古代中国科技较为封闭、落后 5.下列重要的科技发明出现的先后顺序是() ①蔡伦改进造纸术②指南针(司南)的出现③火药被用于军事④活字印刷术的发明 A.①②④③ B.②①③④ C.②③①④ D.②①④③

《一个中国孩子的呼声》教学实录

《一个中国孩子的呼声》教学实录(1) 一、创设情景,导入新课 师:孩子们,刚才你们的那一声甜甜的“老师好!”,老师感到好幸福好幸福。孩子们,能把你感到最幸福的一件事说给老师和同学们听听吗? 生:愿意。 生1:能认识刘老师,我感到很幸福。 生2:一家人快乐地生活在一起,我感到很幸福。 生3:过生日的时候,我感到很幸福。 …… 师:现在,我们都在和平的环境中幸福地生活着。可是,你知道吗?这样安定的生活并不属于每一个孩子,因为世界上有不少地区还弥漫着战争的硝烟。不信,请看(课件出示战争场面及战争带来的后果。) 师:令人心惊胆战的炮声中,一座座高楼大厦变成了废墟,惊慌失措的人们四处逃窜,躲避着随时可能飞来的炮弹。战争让人们流离失所,死伤无数,一个两、三岁的小男孩大声地哭喊着:爸爸、妈妈、你们在哪儿啊? 师:看到这些情况,你能不能用一个词语来形容战争给你的感受是什么? 生:痛苦、残忍、憎恨、悲痛…… 师:是啊!生活在战争中的人们,他们无时无刻不在祈盼和平的降临,因为和平意味着生的希望,意味着能尽情享受阳光。同学们,今天老师想带大家一起走近一位曾经被战争夺去父亲的生命、饱尝失去亲人痛苦的孩子,让我们一起去聆听这位孩子发自内心的呼声吧!(出示课题) 师:让我们一起来读读课题(22、一个中国孩子的呼声) 二、质疑读文,整体感知 1、引导学生对课题质疑。 师:同学们,题目是文章的眼睛,读过课题之后,你想知道些什么?能根据课题提出几个问题吗? 生1:这个中国孩子是谁? 生2:他向谁发出了什么呼声? 生3:他为什么要发出这样的呼声? …… 师:孩子们真会提问题,待会儿我们一起来解决这些问题,好吗? 2、检测课前预习情况。 (1)、检测生字。 师:在课前,同学们已经进行了充分的准备,先来展示一下你对生字的预习情况。 (课件出示:执行、维护、给予、素质、沉浸、凯旋、遗体、硕士、贡献、圣坛、威胁、呼吁、妻子、充满) 师:这是本课要会读会写的生字新词,在预习时,发现哪些生字新词容易读错,谁愿来当当小老师,给同学们提醒一下。 生1:“给予”的“给”应读“jǐ”。 生2:“充满”的“充”应读翘舌音。 生3:“沉浸”的“浸”不能读成“qìn”。…… 师:让我们一起来读一读这些词语。 师:为了避免这些生字写错,谁愿来当小老师,给大家提醒一下。 生1:“妻”上下结构,下面是个“女”字。 生2:“凯”的左下部分不能写成“己”。 生3:“予”不能写成“矛”。 …… 师:请同学们读一读这四个词语,注意“手腕”的“腕”应读四声“wàn”。

中国古代科学技术和思想文化

中国古代科学技术和思想文化 一、科学技术 1、青铜艺术 中国古代青铜工艺的杰出代表是司母戊鼎(商朝),世界现存最大的青铜器。 2、医学成就 ① 东汉 时期的 华佗 : ①擅长外科手术 ②制成麻醉药剂“ 麻沸散 ”, 是世界医 学史上的创举。③模仿虎鹿熊猿鸟编制医学体操“ 五禽戏 ” ② 东汉 时期的 张仲景: 写成《伤寒杂病论》全面介绍了中医理论和治病原则,被称为“ 医圣 ”。 ③ 明朝 时期的李时珍: 著《 本草纲目 》是一部总结性的 药物学 巨著,被译成多国文字。内容丰富,考订详细,附有大量插图。被译成多国文字,成为世界医学的重要文献。 3、科技成就 ①地动仪: 东汉 时期 张衡 制造的,是世界上最早的地震仪器。 ②《 齐民要术 》:北朝农学家 贾思勰 所著,是我国现存第一部完整的农业科学著作。总结了北方劳动人民积累的生产经验,介绍农、林、牧、副、渔的生产技术和方法。 ③《 水经注 》:北魏地理学家 郦道元 所著,是一部综合性的地理学专著。 详细地介绍了江河流经地区的山川城镇、地形物产、风土人情、历史古迹等。 ④《 天工开物 》: 明 朝 宋应星 著,被誉为“ 中国17世纪的工艺百科全书 ”。 (书中总结明代农业和手工业生产技术,还反映了我国手工工场的生产面貌,涉及到农业和手工业等30多个生产部门,强调人类要和自然相协调、人力要与自然力相配合) 4、建筑成就 ① 都江堰: 战国 时秦国的李冰所修,是闻名世界的防洪灌溉工程,使成都平原获得“天府之国”的美称。 ②赵州桥: 隋 朝工匠李春设计,是世界上现存最早的一座石拱桥,比欧洲早 700 多年。 突火枪 、 二、思想文化 1、汉字演变: 甲骨文 → 金文 → 大篆 → 小篆 → 隶书 商朝 商周 西周晚期 秦朝 秦朝 我国有文字可考的历史,是从商朝开始的。 2、史学和文学成就

《一个中国孩子的呼声》教学实录

《一个中国孩子的呼声》教学实录

《一个中国孩子的呼声》教学实录(1) 一、创设情景,导入新课 师:孩子们,刚才你们的那一声甜甜的“老师好!”,老师感到好幸福好幸福。孩子们,能把你感到最幸福的一件事说给老师和同学们听听吗? 生:愿意。 生1:能认识刘老师,我感到很幸福。 生2:一家人快乐地生活在一起,我感到很幸福。 生3:过生日的时候,我感到很幸福。 …… 师:现在,我们都在和平的环境中幸福地生活着。可是,你知道吗?这样安定的生活并不属于每一个孩子,因为世界上有不少地区还弥漫着战争的硝烟。不信,请看(课件出示战争场面及战争带来的后果。) 师:令人心惊胆战的炮声中,一座座高楼大厦变成了废墟,惊慌失措的人们四处逃窜,躲避着随时可能飞来的炮弹。战争让人们流离失所,死伤无数,一个两、三岁的小男孩大声地哭喊着:爸爸、妈妈、你们在哪儿啊?师:看到这些情况,你能不能用一个词语来形容战争给你的感受是什么? 生:痛苦、残忍、憎恨、悲痛…… 师:是啊!生活在战争中的人们,他们无时无刻不在祈盼和平的降临,因为和平意味着生的希望,意味着能尽

情享受阳光。同学们,今天老师想带大家一起走近一位曾经被战争夺去父亲的生命、饱尝失去亲人痛苦的孩子,让我们一起去聆听这位孩子发自内心的呼声吧!(出示课题) 师:让我们一起来读读课题(22、一个中国孩子的呼声) 二、质疑读文,整体感知 1、引导学生对课题质疑。 师:同学们,题目是文章的眼睛,读过课题之后,你想知道些什么?能根据课题提出几个问题吗? 生1:这个中国孩子是谁? 生2:他向谁发出了什么呼声? 生3:他为什么要发出这样的呼声? …… 师:孩子们真会提问题,待会儿我们一起来解决这些问题,好吗? 2、检测课前预习情况。 (1)、检测生字。 师:在课前,同学们已经进行了充分的准备,先来展示一下你对生字的预习情况。 (课件出示:执行、维护、给予、素质、沉浸、凯旋、遗体、硕士、贡献、圣坛、威胁、呼吁、妻子、充满)师:这是本课要会读会写的生字新词,在预习时,发现哪些生字新词容易读错,谁愿来当当小老师,给同学们

【通用版】2020中考历史专题训练卷:中国古代科学技术和思想文化(含答案)

中国古代科学技术和思想文化 1.(2017年山东德州)文物是鲜活的历史。下列古代器物中,能印证商朝青铜器生产工艺高超的是 A.人面鱼纹盆 B.司母戊鼎 C.毛公鼎 D.兵马俑 2.(2017年湖南邵阳)在《影响人类历史进程的100名人》中的第75位名人的评语是“孔子之前对人类思想最有影响力的中国哲学家,道家学派创始人。”第75位名人是 A.老子B.墨子 C.孟子D.庄子 3.(2017年贵州六盘水)“以人为本,关注民生”是古往今来治国兴邦的基本经验。我国古代思想家最早提出“仁”的学说,主张“爱人”“为政以德”的是 A.孔子B.老子 C.孟子D.荀子 4.(2017年山东潍坊)战国时期,有一学派认为:明主像天,因为他依法行事,公正无私。明主有权威、权力以加强其命令的力量。这一学派是 A.儒家B.墨家 C.法家D.道家 5.(2017年重庆A)秦汉时期创造了辉煌灿烂的东方文明,科技发展在世界上遥遥领先。下列属于秦汉时期科技成就的有 ①《九章算术》②《齐民要术》③造纸术的发明和改进④全身麻醉手术法 A.①②③B.①②④ C.①③④D.②③④ 6.(2017年山东滨州)下列对下图实物表述不正确的是 A.多为占卜记录 B.一种比较成熟的文字

C.反映了夏朝的历史 D.河南安阳大量出土 7.(2017年山东临沂)图1中的历史人物被后人称为“书圣”,他集书法之大成,自成一家,影响深远。该图中的作品反映了他使用的哪种书法字体? A.篆书B.隶书 C.楷书D.行书 8.(2017年江苏连云港)有学者认为:“在许多方面,宋朝在中国都是个最令人激动的时代,它统辖着一个前所未见的发展、创新和文化繁盛期。”此时的“创新和文化繁盛”主要表现为 ①造纸术②交子③活字印刷术④指南针普遍用于航海 A.①②③B.①②④ C.①③④D.②③④ 9.(2017年湖北孝感)要详细了解明朝中后期江西景德镇瓷器制作工艺,可以查阅的书籍是 A.《史记》B.《资治通鉴》 C.《天工开物》D.《本草纲目》 10.(2017年山东泰安)央视科教频道推出的中国诗词大会,触发了全民学习研究古诗词文化的热情。某班诗词比赛中有这样一道题目:“特点:豪放风格;成就:文学家、书法家;经典名句:大江东去,浪淘尽,千古风流人物”。符合题目要求的词人是 A.苏轼B.李清照 C.岳飞D.辛弃疾 11.社会大变革是战国时期的主要社会特征。诸子百家的观点中,顺应了当时历史发展潮流的是 A.儒家的“仁政” B.法家的“建立中央集权专制统治” C.墨家的“兼爱”“非攻” D.道家的“顺应自然与民心” 12.下列对佛教和道教相同之处的表述,不正确的是 A.都是中国土生土长的宗教 B.都具有唯心主义的色彩

一个中国孩子的呼声

《一个中国孩子的呼声》说课稿 今天我说课的内容是四年级语文上册第五单元的一篇讲读课文——《一个中国孩子的呼声》。我的说课分为以下几个部分: 一、说教材 这篇课文属于书信体文章,是一个中国孩子写给联合国秘书长加利的一封信。这封信首先表达了我和妈妈对加利先生的问候和深深的敬意;接着深情回忆我的爸爸出征前后的情景,在悲痛中怀着自豪和崇敬,并表示要向爸爸学习,用生命捍卫和平;最后,呼吁国际社会一致行动起来,维护和平,制止战争!课文用孩子的眼光看世界和平,把家庭的不幸和世界的不幸有机联系在一起,饱含着一个孩子失去亲人的悲愤和对和平无比渴望的真挚情感,语言朴实,内容感人。 我结合教材本身的特点及学生的实际情况,制定了以下教学目标:(一)知识与能力目标 认识7个生字,会写18个字。正确读写本课词语。理解信的主要内容,有感情的朗读课文,理解含义深刻的句子。 (二)过程与方法目标 了解信的主要内容,理解含义深刻的句子,体会作者所失去亲人的悲愤和对和平无比渴望的真挚情感。 (三)情感态度与价值观目标 引导学生从小放眼世界,关注国际局势,树立热爱和平、维护和平的信念。 本课的教学重点是理解信中“我”的呼吁,体会“我”对父亲的深切怀念、对和平的无比渴望。 教学难点是认识“世界并不太平,不少地区还弥漫着战争的硝烟,罪恶的子弹还威胁着娇嫩的‘和平之花’”,树立维护和平的观念。 二、说教学准备 由于四年级学龄段的孩子接触事物直观、具体,喜欢通过自己的观察去发现生活,本文内容距离学生的现实生活较远。学生自主感悟和平与战争两个对峙性强的概念还缺乏一定的感性基础。因此,在上课前,我做了以下准备工作:

1、布置学生通过多种途径了解国内外大事,关心国际动态,了解维和部队的使命及工作状况。 2、准备多媒体课件,增强教学的直观性。 三、说课时安排 本课的教学,我安排了两个课时的教学时间,在第一课时当中,我想要达成的目标是让学生初读全文,了解课文的主要内容。此基础上,第二课时主要的学习任务是有感情的朗读课文,体会作者表达的真挚情感,理解含义深刻的句子。今天我主要说的是第二课时的教学程序及教学方法。 四、说教学程序及教学理念 崔峦老师曾经说过:“阅读教学的过程,是每个学生潜心读书,获得个人体验和独特感受的过程;是学生、教师、文本对话、思维碰撞、情感交流的过程。”因此,我认为在教学中,只有引导学生与文本对话,用心灵感受,实现思想与思想的碰撞,情感与情感的交融,心灵与心灵的接纳,课堂才能在对话中充满活力,才能呈现出生动活泼、主动的“生命状态”。基于这样的想法,我设计了这节课。 第一个教学环节,借助多媒体课件,激趣导入新课。 由于我们的学生生活在中国这片和平的圣土上,对于战争,他们缺乏深入的了解。无论是时间、空间,距离学生的实际都很远。这样,在学生与文本的对话之间就会产生一定的障碍。为此,我利用下载的图片资源,经过选择,整和、加工后再现情景,让学生形象感知战争的残酷,从内心深处先唤起他们对战争的愤恨和对和平的无比渴望之情,形成了“未成曲调先有情”的氛围。接着我在第一课时学习的基础上,又让学生回顾了书信体文章的结构及本篇课文的主要内容,引出了:雷利发出了怎样的呼声?他为什么发出这样的呼声?(相机板书:和平)导入新课。 第二个教学环节,朗读感悟文本,体会作者表达的真挚情感。 这是本节课教学的一个最重要的环节。我首先围绕雷利之所以发出了这样的呼声是因为他失去了父亲,那他的父亲到底是一个怎样的人呢?让学生自由读书,找出相关的句子,并且勾画出来,根据学生的发言相机板书:爱家庭、有知识、爱和平。然后再让学生通过对一些重点词语的理解朗读、感悟让学生真切的感受到拥有这样的爸爸是如此的令人骄傲与自豪。接着我又让学生想象假如爸爸

从边疆危机到瓜分危机教案

从边疆危机到瓜分危机 1.知识方面:19世纪中后期边疆危机的原因;俄英对 新疆的侵略;左宗棠收复新疆;英国对西藏的侵略;日 本对台湾的侵略;法国对越南的侵略;中法战争的爆发;马尾海战;镇南关大捷;《中法新约》;台湾行省的建立;甲午中日战争爆发的背景;甲午中日战争正式爆发;平 壤战役;黄海战役;旅顺、大连战役;威海卫战役;中 日《马关条约》;三国干涉还辽;列强对中国资本的输出:争做中国的债主,抢夺筑路权,开矿权和建厂权:列强 在中国强占租借地,划分“势力范围”;美国提出“门 户开放”政策。 2.能力方面: (1)通过对“19世纪中后期边疆危机出现的原因及表现”的教学,培养学生综合概括历史问题的能力。 (2)通过分析历史材料解决历史问题的教学、培养学生从历史材料中最大限度在获取有效信息,学会分析问题、炼达观点的能力。 (3)通过中日战争过程的教学,引导学生分析清军海战皆败的原因。从而培养学生用辩证唯物主义和历史唯物

主义的观点分析问题的能力。 (4)通过对《马关条约》和《南京条约》进行比较,分析其给中国社会造成的危害,培养学生分析、比较、综 合问题的能力。 (5)通过学生总结列强对华资本输出的方式,美国“门户开放”政策提出的目的,影响等,培养学生的归纳、 分析能力。 (6)通过总结19世纪末帝国主义侵略中国的史实,概括当时中国时局最突出的特点,培养学生从整体上、宏观 上把握历史事件内在联系的能力。 3.思想情感方面: (1)通过中国边疆新危机出现原因的教学,加深学生对资本主义扩张性的认识,培养学生自觉维护国家民族利 益的献身精神。 (2)通过左宗棠收复新疆及镇南关大捷的教学,激发学生的爱国热情,继承和发扬中华民族保卫祖国的优良传统。 (3)通过对甲午中日战争中国军队战败原因持分析教学,让学生认识到:社会制度的腐败,军事技术的落后,是 近代中国挨打受辱的关键所在。 4.学法指导方面: (1)引导学生学会类比联想思维方法,加深对历史现象

《一个中国孩子的呼声》教案

《一个中国孩子的呼声》教学设计 教学目标: 1.让学生掌握了课文的部分内容。 2.理解课文深刻的句子。 3.教学重难点:理解课文深刻的句子。 准备:教师为学生讲述两个真实的故事 课时:1课时 一、引入。 1.观看央视国际4套上播放的伊拉克专题,加上教师录制的音乐和旁白。 2.抽学生说说自己看了之后自己的感想。 3.教师小结:战争是无情的,战争是残酷的……今天,让我们一起去聆听一个中国孩子的呐喊吧! 学生齐读课题,再读。 二、按要求自读课文。 多媒体出示自读要求: 思考并勾画句子: 1.作者的爸爸是个怎样的人?(用横线勾出) 2.当今的和平环境怎样?(用波浪线勾出) 3.作者为谁呼吁?(用着重符号标出) 学生自由读课文,勾画相应句子。 三、交流问题,学习课文。 1.教师:爸爸是个什么样的人?你是从哪里知道的? 学生:爸爸是个出色的人。我们能够从“我的爸爸精通四国语言……”看出来。 教师:请你再读一读,读出自豪的感情。 学生:我的爸爸是个热爱和平的人。我们可以从“两年以前,我亲爱的爸爸作为……”看出来。 教师:还有什么地方能够看出爸爸是个热爱和平的人。 学生:“爸爸的嘴张着……” 教师:还有要补充的吗? ……(略) 教师:罗老师找到一个句子。“我至今都忘不了……”。你能看出爸爸是个什么样的人。 学生:是个爱妻子,爱孩子的人。 教师:请大家一起来读一读。 教师:“鲜血染红了他的征衣……”。你体会到什么?

学生:我能从这里体会到爸爸的尽职尽责。 教师:请同学们互读互评。(学生读,较有感情。) 教师用学生“找”和自己“引”的办法初步让学生掌握了课文的部分内容,“拉”得比较快。目的显然是为后面“突出重点”——感情朗读做一些准备。2.教师:下面我请三个同学分段朗读课文的三至五自然段,要读得好象在和父亲面对面地交流。 学生读,比较好,全体学生自发鼓掌。 教师:我们把第三自然段读一读,体会低沉、坚定的思想。(学生读) 教师:可是当作者看到爸爸的灵柩时,心情怎样?(由激动到悲伤),请大家再读“现在……浸满了凝固的血。”(齐读) 教师:嘴张着,在呼唤什么?我们该怎样读?谁来给大家示范一下。 抽读,一学生读得很到位。 教师:让我们一起来读一读,读出心底的呼唤。 全班再读。 教师:“我”的爸爸本来还可以作出更大的贡献,因为他是精通四国语言的……(学生回答:经济学硕士)。请大家读四自然段。 教师:自豪的“味儿”不够,请大家再读一遍。 学生再读,很有感情。 展示“万人送英雄,鲜花赠英模”的画面。加上背景音乐和一个孩子对爸爸缅怀的旁白,课堂上的气氛变得更加凝重。 罗老师对于这个环节的处理是很精彩的,重点指导了学生的朗读,以读悟情。我觉得也可以从爸爸和我们“相约”,到我们“如约”前往,再到爸爸的“失约”,这样可以更清楚地理清文章的线索,后面探讨爸爸“失约”的原因。这和重点指导朗读并无矛盾。 教师:爸爸为和平献出自己的生命,却“死不瞑目”,原因是什么? 多媒体出示:“世界并不太平……”一段。学生齐读。 教师:这些话是什么意思?你通过什么方式来理解?(学生发言,略)你知道哪些地方还“弥漫着战争的硝烟”? 学生列举自己收集的资料。 教师:老师也给大家带来了一组数据。(主要是一些战争中带来灾难的数据统计。) 教师:同学们,如此娇嫩的和平之花怎么经得起战争的摧残?请大家一起来读一读《地球的呻吟》。 地球的呻吟 地球把它的一切都给了我们, 它从来不懂得自私和吝啬,

相关文档
相关文档 最新文档