欢迎来到个人简历网!永久域名:gerenjianli.cn (个人简历全拼+cn)
当前位置:首页 > 范文大全 > 心得体会>ucos+lwip应用心得

ucos+lwip应用心得

2024-06-22 07:53:56 收藏本文 下载本文

“huang0”通过精心收集,向本站投稿了7篇ucos+lwip应用心得,下面是小编为大家整理后的ucos+lwip应用心得,如果喜欢可以分享给身边的朋友喔!

ucos+lwip应用心得

篇1:ucos+lwip应用心得

lwIP是瑞士计算机科学院(Swedish Institute of Computer Science)的Adam Dunkels等开发的一套用于嵌入式系统的开放源代码TCP/IP协议栈。Lwip既可以移植到操作系统上,又可以在无操作系统的情况下独立运行.

LwIP的特性如下:

(1)支持多网络接口下的IP转发

(2)支持ICMP协议

(3)包括实验性扩展的的UDP(用户数据报协议)

(4)包括阻塞控制,RTT估算和快速恢复和快速转发的TCP(传输控制协议)

(5)提供专门的内部回调接口(Raw API)用于提高应用程序性能

(6)可选择的Berkeley接口API(多线程情况下)

(7)在最新的版本中支持ppp

(8)新版本中增加了的IP fragment的支持.

(9)支持DHCP协议,动态分配ip地址.

现在网上最新的版本是V0.6.4

1.lwip的进程模型(process model)

tcp/ip协议栈的process model一般有几种方式.

1.tcp/ip协议的每一层是一个单独进程.链路层是一个进程,ip层是一个进程,tcp层是一个进程.这样的好处是网络协议的每一层都非常清晰,代码的调试和理解都非常容易.但是最大的坏处数据跨层传递时会引起上下文切换(context switch).

对于接收一个TCP segment要引起3次context switch(从网卡驱动程序到链路层进程,从链路层进程到ip层进程,从ip层进程到TCP进程).通常对于操作系统来说,任务切换是要浪费时间的.过频的context swich是不可取的.

2.另外一种方式是TCP/IP协议栈在操作系统内核当中.应用程序通过操作系统的系统调用(system call)和协议栈来进行通讯.这样TCP/IP的协议栈就限定于特定的操作系统内核了.如windows就是这种方式.

3.lwip的process model:所有tcp/ip协议栈都在一个进程当中,这样tcp/ip协议栈就和操作系统内核分开了.而应用层程序既可以是单独的进程也可以驻留在tcp/ip进程中.如果应用程序是单独的进程可以通过操作系统的邮箱,消息队列等和tcp/ip进程进行通讯.

如果应用层程序驻留tcp/ip进程中,那应用层程序就利用内部回调函数口(Raw API)和tcp/ip协议栈通讯.对于ucos来说进程就是一个系统任务.lwip的process model请参看下图.在图中可以看到整个tcp/ip协议栈都在同一个任务(tcpip_thread)中.应用层程序既可以是独立的任务(如图中的tftp_thread,tcpecho_thread),也可以在tcpip_thread中(如图左上角)中利用内部回调函数口(Raw API)和tcp/ip协议栈通讯

2 Port Lwip to uCos

在这个项目中我用的硬件平台是s3c44b0x+rtl8019.ucos在44b0上的移植在网上有很多大侠非常详尽的讲解和移植代码.我就不敢罗嗦了.需要说明的一点是lwip会为每个网络连接动态分配一些信号量(semaphone)和消息队列(Message Queue),当连接断开时会删掉这些semaphone和Queue.而Ucos-2.0不支持semaphone和Queue的删除,所以要选择一些较高版本的ucos.我用的是ucos-2.51.

2.1 Lwip的操作系统封装层(operating system.emulation layer)

Lwip为了适应不同的操作系统,在代码中没有使用和某一个操作系统相关的系统调用和数据结构.而是在lwip和操作系统之间增加了一个操作系统封装层.操作系统封装层为操作系统服务(定时,进程同步,消息传递)提供了一个统一的接口.在lwip中进程同步使用semaphone和消息传递采用”mbox”(其实在ucos的实现中我们使用的是Message Queue来实现lwip中的”mbox”,下面大家可以看到这一点)

Operating system emulation layer的原代码在…/lwip/src/core/sys.c中.而和具体的操作系统相关的代码在../lwip/src/arch/sys_arch.c中.

操作系统封装层的主要函数如下:

void sys_init(void)//系统初始化

sys_thread_t sys_thread_new(void (* function)(void *arg), void *arg,int prio)//创建一个新进程

sys_mbox_t sys_mbox_new(void)//创建一个邮箱

voidsys_mbox_free(sys_mbox_t mbox)//释放并删除一个邮箱

voidsys_mbox_post(sys_mbox_t mbox, void *data) //发送一个消息到邮箱

void sys_mbox_fetch(sys_mbox_t mbox, void **msg)//等待邮箱中的消息

sys_sem_t sys_sem_new(u8_t count)//创建一个信号量

void sys_sem_free(sys_sem_t sem)//释放并删除一个信号量

void sys_sem_signal(sys_sem_t sem)//发送一个信号量

void sys_sem_wait(sys_sem_t sem)//等待一个信号量

void sys_timeout(u32_t msecs, sys_timeout_handler h, void *arg)//设置一个超时事件

void sys_untimeout(sys_timeout_handler h, void *arg)//删除一个超时事件

关于操作系统封装层的信息可以阅读lwip的doc目录下面的sys_arch.txt.文件.

2.2 Lwip在ucos上的移植.

2.2.1 系统初始化

sys_int必须在tcpip协议栈任务tcpip_thread创建前被调用.

#define MAX_QUEUES20

#define MAX_QUEUE_ENTRIES20

typedef struct {

OS_EVENT*pQ;//ucos中指向事件控制块的指针

void*pvQEntries;//消息队列

//MAX_QUEUE_ENTRIES消息队列中最多消息数

} TQ_DESCR, *PQ_DESCR;

typedef PQ_DESCRsys_mbox_t;//可见lwip中的mbox其实是ucos的消息队列

static char pcQueueMemoryPool CR) ];

void sys_init(void)

{

u8_t i;

s8_tucErr;

pQueueMem = OSMemCreate( (void*)pcQueueMemoryPool, MAX_QUEUES, sizeof(TQ_DESCR), &ucErr );//为消息队列创建内存分区

//init lwip task prio offset

curr_prio_offset = 0;

//init lwip_timeouts for every lwip task

//初始化lwip定时事件表,具体实现参考下面章节

for(i=0;i

lwip_timeouts.next = NULL;

}

}

2.2.2 创建一个和tcp/ip相关新进程:

lwip中的进程就是ucos中的任务,创建一个新进程的代码如下:

#define LWIP_STK_SIZE10*1024//和tcp/ip相关任务的堆栈大小.可以根据情况自

//己设置,44b0开发板上有8M的sdram,所以设大

//一点也没有关系:)

//max number of lwip tasks

#define LWIP_TASK_MAX5 //和tcp/ip相关的任务最多数目

//first prio of lwip tasks

#define LWIP_START_PRIO5 /

/和tcp/ip相关任务的起始优先级,在本例中优先级可

//以从(5-9).注意tcpip_thread在所有tcp/ip相关进程中//应该是优先级最高的.在本例中就是优先级5

//如果用户需要创建和tcp/ip无关任务,如uart任务等,

//不要使用5-9的优先级

OS_STK LWIP_TASK_STK;//和tcp/ip相关进程

//的堆栈区

u8_t curr_prio_offset ;

sys_thread_t sys_thread_new(void (* function)(void *arg), void *arg,int prio)

{

if(curr_prio_offset < LWIP_TASK_MAX){

OSTaskCreate(function,(void*)0x1111, &LWIP_TASK_STK,

LWIP_START_PRIO+curr_prio_offset );

curr_prio_offset++;

return 1;

} else {

// PRINT(“ lwip task prio out of range ! error! ”);

}

}

从代码中可以看出tcpip_thread应该是最先创建的.

2.2.3 Lwip中的定时事件

在tcp/ip协议中很多时候都要用到定时,定时的实现也是tcp/ip协议栈中一个重要的部分.lwip中定时事件的数据结构如下.

struct sys_timeout {

struct sys_timeout *next;//指向下一个定时结构

u32_t time;//定时时间

sys_timeout_handler h;//定时时间到后执行的函数

void *arg;//定时时间到后执行函数的参数.

};

struct sys

_timeouts {

struct sys_timeout *next;

};

struct sys_timeouts lwip_timeouts;

Lwip中的定时事件表的结构如下图,每个和tcp/ip相关的任务的一系列定时事件组成一个单向链表.每个链表的起始指针存在lwip_timeouts的对应表项中.

函数sys_arch_timeouts返回对应于当前任务的指向定时事件链表的起始指针.该指针存在lwip_timeouts中.

struct sys_timeouts null_timeouts;

struct sys_timeouts * sys_arch_timeouts(void)

{

u8_t curr_prio;

s16_t err,offset;

OS_TCB curr_task_pcb;

null_timeouts.next = NULL;

//获取当前任务的优先级

err = OSTaskQuery(OS_PRIO_SELF,&curr_task_pcb);

curr_prio = curr_task_pcb.OSTCBPrio;

offset = curr_prio - LWIP_START_PRIO;

//判断当前任务优先级是不是tcp/ip相关任务,优先级5-9

if(offset < 0 || offset >= LWIP_TASK_MAX)

{

return &null_timeouts;

}

return &lwip_timeouts;

}

注意:杨晔大侠移植的代码在本函数有一个bug.杨晔大侠的.移植把上面函数中的OS_TCB curr_task_tcb定义成了全局变量,使本函数成为了一个不可重入函数.我也是在进行如下测试时发现了这个bug.我的开发板上设置的ip地址是192.168.1.95.我在windows的dos窗口内运行

ping 192.168.1.95 –l –t,不间断用长度为2000的数据报进行ping测试,同时使用tftp客户端软件给192.168.1.95下载一个十几兆程序,同时再使用telnet连192.168.1.95端口7(echo端口),往该端口写数测试echo功能.

在运行一段时间以后,开发板进入不再响应.我当时也是经过长时间的分析才发现是因为在低优先级任务运行ys_arch_timeouts时被高优先级任务打断改写了curr_task_tcb的值,从而使sys_arch_timeouts返回的指针错误,进而导致系统死锁.函数sys_timeout给当前任务增加一个定时事件:

void sys_timeout(u32_t msecs, sys_timeout_h

andler h, void *arg)

{

struct sys_timeouts *timeouts;

struct sys_timeout *timeout, *t;

timeout = memp_malloc(MEMP_SYS_TIMEOUT);//为定时事件分配内存

if (timeout == NULL) {

return;

}

timeout->next = NULL;

timeout->h = h;

timeout->arg = arg;

timeout->time = msecs;

timeouts = sys_arch_timeouts();//返回当前任务定时事件链表起始指针

if (timeouts->next == NULL) {//如果链表为空直接增加该定时事件

timeouts->next = timeout;

return;

}

//

如果链表不为空,对定时事件进行排序.注意定时事件中的time存储的是本事件

//时间相对于前一事件的时间的差值

if (timeouts->next->time >msecs) {

timeouts->next->time -= msecs;

timeout->next = timeouts->next;

timeouts->next = timeout;

} else {

for(t = timeouts->next; t != NULL; t = t->next) {

timeout->time -= t->time;

if (t->next == NULL ||

t->next->time >timeout->time) {

if (t->next != NULL) {

t->next->time -= timeout->time;

}

timeout->next = t->next;

t->next = timeout;

break;

}

}

}

}

函数sys_untimeout从当前任务定时事件链表中删除一个定时事件

void sys_untimeout(sys_timeout_handler h, void *arg)

{

struct sys_timeouts *timeouts;

struct sys_timeout *prev_t, *t;

timeouts = sys_arch_timeouts();//返回当前任务定时事件链表起始指针

if (timeouts->next == NULL)//如果链表为空直接返回

{

return;

}

//查找对应定时事件并从链表中删除.

for (t = timeouts->next, prev_t = NULL; t != NULL; prev_t = t, t = t->next)

{

if ((t->h == h) && (t->arg == arg))

{

/* We have a match */

/* Unlink from previous in list */

if (prev_t == NULL)

timeouts->next = t->next;

&nbs

p;else

&nbs

p;prev_t->next = t->next;

/* If not the last one, add time of this one back to next */

if (t->next != NULL)

t->next->time += t->time;

memp_free(MEMP_SYS_TIMEOUT, t);

return;

}

}

return;

}

2.2.3“mbox”的实现:

(1)mbox的创建

sys_mbox_t sys_mbox_new(void)

{

u8_tucErr;

PQ_DESCRpQDesc;

//从消息队列内存分区中得到一个内存块

pQDesc = OSMemGet( pQueueMem, &ucErr );

if( ucErr == OS_NO_ERR ) {

//创建一个消息队列

pQDesc->pQ=OSQCreate(&(pQDesc->pvQEntries), MAX_QUEUE_ENTRIES );

if( pQDesc->pQ != NULL ) {

return pQDesc;

}

}

return SYS_MBOX_NULL;

}

(2)发一条消息给”mbox”

const void * const pvNullPointer = 0xffffffff;

void sys_mbox_post(sys_mbox_t mbox, void *data)

{

INT8U err;

if( !data )

data = (void*)&pvNullPointer;

err= OSQPost( mbox->pQ, data);

}

在ucos中,如果OSQPost (OS_EVENT *pevent, void *msg)中的msg==NULL 会返回一条OS_ERR_POST_NULL_PTR错误.而在lwip中会调用sys_mbox_pos

t(mbox,NULL)发送一条空消息,我们在本函数中把NULL变成一个常量指针0xffffffff.

(3)从”mbox”中读取一条消息

#define SYS_ARCH_TIMEOUT 0xffffffff

void sys_mbox_fetch(sys_mbox_t mbox, void **msg)

{

u32_t time;

struct sys_timeouts *timeouts;

struct sys_timeout *tmptimeout;

sys_timeout_handler h;

void *arg;

again:

timeouts = sys_arch_timeouts();////返回当前任务定时事件链表起始指针

if (!timeouts || !timeouts->next) {//如果定时事件链表为空

&n

bsp;sys_arch_mbox_fetch(mbox, msg, 0);//无超时等待消息

} else {

if (timeouts->next->time >0) {

//如果超时事件链表不为空,而且第一个超时事件的time !=0

//带超时等待消息队列,超时时间等于超时事件链表中第一个超时事件的time,

time = sys_arch_mbox_fetch(mbox, msg, timeouts->next->time);

//在后面分析中可以看到sys_arch_mbox_fetch调用了ucos中的OSQPend系统调

//用从消息队列中读取消息.

//如果”mbox”消息队列不为空,任务立刻返回,否则任务进入阻塞态.

//需要重点说明的是sys_arch_mbox_fetch的返回值time:如果sys_arch_mbox_fetch

//因为超时返回,time=SYS_ARCH_TIMEOUT,

//如果sys_arch_mbox_fetch因为收到消息而返回,

//time = 收到消息时刻的时间-执行sys_arch_mbox_fetch时刻的时间,单位是毫秒

//由于在ucos中任务调用OSQPend系统调用进入阻塞态,到收到消息重新开始执行

//这段时间没有记录下来,所以我们要简单修改ucos的源代码.(后面我们会看到).

} else {

//如果定时事件链表不为空,而且第一个定时事件的time ==0,表示该事件的定时

//时间到

time = SYS_ARCH_TIMEOUT;

}

if (time == SYS_ARCH_TIMEOUT) {

//一个定时事件的定时时间到

tmptimeout = timeouts->next;

timeouts->next = tmptimeout->next;

h = tmptimeout->h;

arg = tmptimeout->arg;

memp_free(MEMP_SYS_TIMEOUT, tmptimeout);

//从内存中释放该定时事件,并执行该定时事件中的函数

if (h != NULL) {

h(arg);

}

//因为定时事件中的定时时间到或者是因为sys_arch_mbo_fetch超时到而执行到

//这里,返回本函数开头重新等待mbox的消息

goto again;

} else {

//如果sys_arch_mbox_fetch无超时收到消息返回

//则刷新定时事件链表中定时事件的time值.

if (time <= timeouts-=“”>next->time) {

timeouts->next->time -= time;

} else {

timeouts->next->time = 0;

}

}

}

}

u32_tsys_arch_mbox_fetch(sys_mbox_t mbox, void **data, u32_t timeout)

{

u32_tucErr;

u16_t ucos_timeout;

//在 lwip中 ,timeout的单位是ms

// 在ucosII ,timeout 的单位是timer tick

ucos_timeout = 0;

if(timeout != 0){

ucos_timeout = (timeout )*( OS_TICKS_PER_SEC/1000);

if(ucos_timeout < 1)

ucos_timeout = 1;

else if(ucos_timeout >65535)

ucos_timeout = 65535;

}&nbs

p;

//如果data!=NULL就返回消息指针,

if(data != NULL){

*data = OSQPend( mbox->pQ, (u16_t)ucos_timeout, &ucErr );

}else{

OSQPend(mbox->pQ,(u16_t)ucos_timeout,&ucErr);

}

//这里修改了ucos中的OSQPend系统调用,

//原来的void*OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)

// err的返回值只有两种:收到消息就返回OS_NO_ERR,超时则返回OS_TIMEOUT

//这里先将err从8位数据改变成了16位数据 OSQPend(*pevent,timeout, INT16U *err)

//重新定义了OS_TIMEOUT

//在ucos中原有#define OS_TIMEOUT 20

//改为 #defineOS_TIMEOUT-1

//err返回值的意义也改变了,如果超时返回OS_TIMEOUT

// 如果收到消息,则返回OSTCBCur->OSTCBDly修改部分代码如下

//if (msg != (void *)0) { /* Did we get a message?*/

// OSTCBCur->OSTCBMsg = (void *)0;

// OSTCBCur->OSTCBStat= OS_STAT_RDY;

// OSTCBCur->OSTCBEventPtr = (OS_EVENT *)0;

// *err = OSTCBCur->OSTCBDly;// zhangzs @.12.12

//OS_EXIT_CRITICAL();

// return (msg);/* Return message received */

//&n

bsp;}

//关于ucos的OSTBCur->OSTCBDly的含义请查阅ucos的书籍

if( ucErr == OS_TIMEOUT ) {

timeout = SYS_ARCH_TIMEOUT;

} else {

if(*data == (void*)&pvNullPointer )

*data = NULL;

//单位转换,从ucos tick->ms

timeout = (ucos_timeout -ucErr)*(1000/ OS_TICKS_PER_SEC);

}

return timeout;

}

semaphone的实现和mbox类似,这里就不再重复了.

篇2:《分式方程及其应用》教学心得

《分式方程及其应用》教学心得

1.分式方程:分母中含有的方程叫分式方程.

2.解分式方程的一般步骤: (1)去分母,在方程的两边都乘以( ),约去分母,化成整式方程; (2)解这个整式方程; (3)验根,把整式方程的根代入( ),看结果是不是零,使最简公分母为零的根是原方程的增根,必须舍去.

3. 用换元法解分式方程的一般步骤: ① 设辅助未知数,并用含辅助未知数的.代数式去表示方程中另外的代数式; ② 解所得到的关于辅助未知数的新方程,求出辅助未知数的值; ③ 把辅助未知数的值代入原设中,求出原未知数的值; ④ 检验作答.

4.分式方程的应用: 分式方程的应用题与一元一次方程应用题类似,不同的是要注意检验: (1)检验所求的解是否是所列();(2)检验所求的解是否().

5.易错知识辨析: (1) 去分母时,不要漏乘没有分母的项. (2) 解分式方程的重要步骤是检验,检验的方法是可代入最简公分母, 使最简公分母为0的值是原分式方程的增根,应舍去,也可直接代入原方程验根. (3) 如何由增根求参数的值:①将原方程化为整式方程;②将增根代入变形后的整式方程,求出参数的值.

例2在春运期间,我国南方出现大范围冰雪灾害,导致某地电路断电.该地供电局组织电工进行抢修.供电局距离抢修工地15千米.抢修车装载着所需材料先从供电局出发,15分钟后,电工乘吉昔车从同一地点出发,结果他们同时到达抢修工地.已知吉普车速度是抢修车速度的1.5倍,求这两种车的速度.

例3某中学库存960套旧桌凳,修理后捐助贫困山区学校.现有甲、乙两个木工小组都想承揽这项业务.经协商后得知:甲小组单独修理这批桌凳比 乙小组多用20天;乙小组每天比甲小组多修8套;学校每天需付甲小组修理费80元,付乙小组120元. (1)求甲、乙两个木工小组每天各修桌凳多少套. (2)在修理桌凳过程中,学校要委派一名维修工进行质量监督,并由学校负担他每天10元的生活补助.现有以下三种修理方案供选择: ① 由甲单独修理;② 由乙单独修理;③ 由甲、乙共同合作修理. 你认为哪种方案既省时又省钱?试比较说明.

7.今年以来受各种因素的影响,猪肉的市场价格仍在不断上升.据调查,今年5月份一级猪肉的价格是1月份猪肉价格的1.25倍.小英同学的妈妈同样用20元钱在5月份购得一级猪肉比在1月份购得的一级猪肉少0.4斤,那么今年1月份的一级猪肉每斤是多少元?

8.今年五月,某工程队(有甲、乙两组)承包人民路中段的路基改造工程,规定若干天内完成.

(1) 已知甲组单独完成这项工程所需时间比规定时间的2倍多4天,乙组单独完成这项工程所需时间比规定时间的2倍少16天.如果甲、乙两组合做24天完成,那么甲、乙两组合做能否在规定时间内完成?

(2) 在实际工作中,甲、乙两组合做完成这项工程的 后,工程队又承包了东段的改造工程,需抽调一组过去,从按时完成中段任务考虑,你认为抽调哪一组最好?请说明理由.

篇3:二陈汤的应用心得

二陈汤的应用心得分享

二陈汤,方出《和剂局方》,由制半夏15g,陈皮、茯苓各12g,炙甘草6g组成。方中制半夏燥湿化痰,和胃降气为主药;陈皮行气化痰,茯苓渗湿化痰为辅药;炙甘草补益脾胃,调和诸药为佐使。故合之,为燥湿化痰,和中降气之良方。

痰湿内停,既可阻滞气机,壅塞经络,寒化热化,生风致瘀,兼挟外感、内伤等,以此方为基础,随证加减出入,灵活化裁,常可用于多种疾病的治疗。如今,本方加减广泛用于慢性支气管炎、慢性胃炎、消化道溃疡、神经性呕吐、神经衰弱、甲状腺肿及小儿流涎等病。

痰湿滞胃,气机受阻,其证胃脘胀痛,嗳气稍舒,食少乏味,厌吃油腻,苔白腻,脉缓濡等。应除痰湿,消胀痛,和胃气。此病笔者常用二陈汤加苍术、白术、木香、砂仁各9g治之,每收良效。嗳气食臭者,挟食滞也,宜加山楂、麦芽、神曲各15g;自感脘部发凉者,痰湿寒化也,宜加干姜9g、厚朴15g;痛而拒按者,挟有瘀血也,宜加川楝子、延胡索各12g。

痰湿中阻不解,又见胃脘胀闷发热,吞酸吐酸,苔色变黄,脉来滑数者,痰湿化热也。笔者遇此病,每用二陈汤加黄连9g、黄芩12g治之,数剂即效。若痰湿化热,伤及胃络而呕血色黑者,宜上方再加枳实15g,竹茹、侧柏叶炭、荷叶炭各9g,甚验;若呕吐不止,大便干结不下者,加大黄9g治之,得泻病减。

痰湿不解,阻滞经络,致阳气不得通畅者,其证尚见身麻或肢麻。应祛除痰湿,通经活络。此病笔者常用二陈汤加苍术、天麻、胆南星各12g,橘络、丹参各18g,并坚持守方,每获良效。

中焦痰湿不解,蒙被清阳而致眩晕者,其证除痰湿中阻外,尚有眩晕,如坐舟车,甚则恶心呕吐等,当涤除痰湿,用二陈汤加白术、天麻各12g,蔓荆子9g,大枣4枚治之,其效颇佳。苔白腻变黄,又心烦口若者,痰湿化热也。宜加柴胡15g,黄芩12g。恶寒发热,无汗,头身不适者,挟有外感风寒也。宜加荆芥、防风、紫苏各12g治之。

手足厥冷由痰湿内聚所致者,可急用二陈汤加苍术、藿香各9g,竹沥、生姜汁各30滴,以除湿逐痰,痰湿去则手足厥冷自除。若上证继而又见汗出不止,脉来沉弱者,为痰湿致少阴阳虚欲脱之候也。宜用二陈汤加附片(久煎)、黄芪、干姜以祛痰除湿,回阳救逆。

痰湿内聚,浊气上攻而头痛者,其治应以祛痰除湿为主,止痛为辅。用二陈汤加苍术9g、川芎12g、白芷5g治之,数剂即见著效。若只见偏头痛者,挟少阳风热也。宜于二陈汤加柴胡15g,黄芩、川芎、防风各12g治之。久病头风不愈,用此方治之,也有一定效果。

篇4:计算机应用基础心得

一、感受与体会

1、基础很重要实践证明,对文字、表格等的处理都是计算机课程的基础,需要一定的操作桌面的知识和能力,需要一定的工具操作能力,学好这些是学习计算机的入门,所以尤为重要!

2、循序渐进整个学习过程应采用循序渐进的方式,先了解计算机的基本知识,如计算机的起源、发展、windowsXX、xp的桌面操作、电子表格等,使自己能由浅入深,由简到繁地掌握他们的使用技术。

3、学以致用在学习时始终要与实际应用相结合,不要把主要精力花费在各个命令孤立地学习上;要把学以致用的原则贯穿整个学习过程,以让自己对命令能有深刻和形象的理解。

4、熟能生巧word作为文字操作专家,它能使我们更加深入地理解、熟练文字操作的命令。要强迫自己做几个综合实例,分别详细地进行文字编辑,使自己可以从全局的角度掌握整个编辑过程,力争使自己学习完word之后就可以投身到实际的工作中去。

二、学习建议

1、常见问题要弄懂对于经常出现的问题,要及时解决。如果推脱,那么问题就越堆越多,不利于今后的学习。

2、有比较,才有鉴别容易混淆的命令,要注意使自己弄清它们之间的区别。

3、养成良好习惯规范操作。我的体会是:养成良好的习惯,受益匪浅!学无止境,只要大家在学习中善于总结和归纳,一定能找到最佳学习方法。感谢陈老师的悉心教导。通过这次短暂的学习,我的收获很大。我会在今后的学习和工作中更加努力。

总的来说,任何的学习对于我们来说都是进步,而在这样的信息时代,我们不单单要牢牢掌握专业知识,也要紧跟时代的步伐,学好计算机,成长为新时代的优秀人才。

篇5:计算机应用基础心得

以下是结合我的教学经验,在20xx年--20xx年第一学期的《计算机应用基础课程》的教学中的一点心得:

1、为学生创设良好的学习情境。

在计算机基础的教学中,学生的学习环境往往会不同程度地影响学生的学习态度、学习兴趣以及最终的学习效果。因此,在平时教学中,我力求为学生创设一个轻松愉快而又有助于学生理解、运用知识的学习情境。如:每次上课时,我首先会向学生展示案例的效果,将课前精心准备好的'ppt文稿式样用计算机演示出来,告诉学生这就是他们将要学习的而且要求每人完成的,以增进学生一些感性上的认识,让他们有个准备。

2、设立互助小组,组织学生讨论。

我们需要明确的是为什么要学习该课程呢?在当今这样一个信息飞速发展、迅速传递的信息时代,不掌握一定的信息技术,也就不能够抓住快速传递的信息的能力,势必会被时代所淘汰。因此每位学生无论是哪个专业都应该初步掌握使用计算机技术去获取信息、处理信息的能力。

计算机应用基础课程能教会学生编辑排版文章、处理表格,甚至图形等,学生往往觉得很有用、很有趣。我便组织学生讨论,结合学习过度共同探讨,利用计算机可以做一些什么事?又决定做些什么事?

3、激发学生的学习兴趣。

学习兴趣,是学生学习和掌握知识的动力和源泉。在计算机应用基础的教学中充分激发学生学习知识的兴趣,是我们计算机教师在组织教学过程中首要的任务。而如何激发学生学习兴趣,关键在于让学生觉得他们所学的东西有用有价值,一方面要逐步满足学生的好奇心理,另一方面要让学生有更多尝试和实践的机会。我发现,一旦学生对学习内容感兴趣的话,他们就会锲而不舍地钻研下去,以致掌握熟练的操作技能。

实践证明,这种做法有助于增进学生之间的情感交流,培养学生合作学习的能力,激发学生学习的乐趣,这些作用往往是教师所无法取代的。

4、鼓励学生学以致用。

结合实用需求,讲解课本外的计算机知识.比如:因为生活质量提高,好多家庭配有电脑,所以在介绍主机时,给学生讲解主机背段接口(如键盘,鼠标,usb等接口),并打开主机箱,让学生认识机箱内的硬件设备.讲到网络应用时,教学生下载手机铃声,图片等。因此,只要学生能把所掌握的知识加以运用,在运用中再学习、再发现,不断创新,就能不断发展。

我鼓励和支持学生利用计算机去做自己愿意做的事情,去完成其他学科的作业、做实验或进行辅助学习等等。此类做法,确实加深了学生对所学知识的理解,又充分发挥了他们自主创新的劳动和集体智慧的创造,有利于学生的发展。

5、让学生领会到这是一种美的教育。

计算机应用基础的教学不仅仅要使得学生掌握知识技能,更重要的是让学生在学习过程中受到美的陶治,使他们认识到学习是一种享受,鼓励他们追求美、创造美,从而激发他们创作的热情,注意培养他们的艺术观点和美的鉴赏能力,以及他们想象的直觉能力的培养。只有这样,才能使他们的智力发展完善,成长为创造型人才。

在教学的过程中,我还要求学生编辑出版自己的小报刊以及广告设计策划等,引导学生在创作过程中欣赏美、鉴赏美,也享受由劳动而来的快乐和美的熏陶。

计算机应用基础的教学是艺术,艺术的发展是无止境的,它需要我们不断地去实践、探索、创新。

篇6:计算机应用基础心得

近年来,我国职业院校发展很快,而学生生源质量一直没有明显提高,学生的学习态度不端正、自我控制能力不强是大部分职业院校学生存在的问题。学生入学时掌握计算机的水平也参差不齐,有的已经非常熟练,而有的却从未接触过计算机。若采用传统的教学方法,学生容易感到枯燥乏味。很多职业院校在师资、教学环境和硬件条件也都没有达到相关要求,导致在课堂教学过程中,两极分化较为明显。

《计算机应用基础》是职业学校课程体系中普遍开设的公共基础课,是一门计算机知识的入门课程。计算机应用基础课程的目标是使学生通过学习和上机操作实践,了解计算机这一现代化工具的基本知识,学会计算机基础软件的应用和操作技能,从而具有应用计算机来获取信息的能力,满足和适应信息化社会对学生基本素质的要求。因此,在计算机应用基础课程的教学中要注重精讲细练,培养学生的信息意识和计算机应用能力。结合自己多年的教学体会,从以下方面来谈一谈,供大家参考。

一、结合生活,激发学生学习兴趣。

对青少年学生来说,学习的积极性首先来源于兴趣,兴趣是最好的老师,兴趣是直接推动学生主动学习的内在动力,它促使学生认真学习。如果教师能“寓教于乐”,善于联系生活,将书本知识用生动形象、妙趣精炼的语言来表达出来,就能更好的引起学生学习的浓厚兴趣。

在计算机应用基础开课之前,教师应当认真备课,吃透教材,将计算机的历史、发展、用途和我们的生活紧密相连,将计算机的组成结构和我们人类的结构分工相类比,突出CPU等同大脑的重要地位。在讲课过程中,不要局限于教材,充分调动学生的积极性来回答你的问题,“有哪些同学使用过计算机?”,“在我们生活周围,大家都在哪里见过计算机?”,“计算机有哪些用途?”通过一个一个问题,把同学们常去的超市、银行、移动联通大厅里的计算机介绍给大家,把新闻里常听到的智能机器人、火箭升空和天气预报等等话题与计算机联系起来,把我们常见的宣传单、成绩单和学校的通知等等与将要学习的微软办公软件联系起来。使学生意识到我们的生活工作都离不开电脑,进而会端正学习计算机应用基础这门课程的态度。虽然用了两节课的时间,但学生不仅了解了计算机基础知识,在问答的过程中也加深了老师和同学间的交流,最主要的是要尽可能的提高学生对学习计算机的兴趣。

二、充分利用多媒体教学,加强学生的感官效果。

例如在讲解Excel 20xx电子表格软件的数据计算时,充分利用多媒体设备,课前自制一个期末成绩表,将表中的总分、平均分等需要计算的项目通过讲解进行演示,让同学们有个直观的了解。具体分析如下:

1、展示如下成绩表,并提问回顾有关Excel单元格格式化设置的问题。

2、对比显示利用公式或函数计算完整的成绩表。

3、讲解总分、平均分、单科总分、单科平均分的计算方法。利用SUM求和函数以及AVERAGE求平均值函数计算。

在H3单元格输入公式:=SUM(C3:G3),然后拖填充柄至H14。

在I3单元格输入公式:=AVERAGE(C3:G3),然后拖填充柄至I14。

单科总分、平均分计算方法类似,注意函数参数区间即可。

4、单科最高最低分分别利用MAX和MIN()函数计算。

在C17单元格输入公式:=MAX(C3:C14),然后拖填充柄至G17。

在C18单元格输入公式:=MIN(C3:C14),然后拖填充柄至G18。

5、名次的计算是讲解的难点,最好利用RANK函数的“函数参数”对话框来进行计算。

这个时候要联系前面所学的绝对引用和相对引用,讲解RANK函数的每个参数含义。然后拖填充柄至J12。

6、等级的计算也是讲解的难点,利用IF函数来进行计算,并讲解各个参数的含义。

7、函数的应用告一段落后,可以先让学生自学制作数据图表,并展示制作后的效果图给予参考。

三、以鼓励表扬为主,充分利用上机时间消化巩固所学知识。

在课堂上、在多媒体教室中讲课过程中,一定要预留时间布置上机作业,使他们有时间先动脑筋思考。在机房实践操作过程中,要求学生将所布置的任务独立完成。学生每完成一项操作,都应及时给与鼓励和表扬,加强他们的信心。有提前完成的同学,通过现场提问的方式确定已经充分理解所教知识后,可以委派为临时指导员,指导其他同学的操作。通过这种灵活方式加强学生间的交流,既可以培养学生互助意识,又提高学生运用计算机知识的水平,充分发挥了上机的实践效用。

篇7:ucos+lwip应用心得[社区]

经过几天调试除掉几个bug以后,ucos+lwip在我的44b0+8019开发板上终于跑得比较稳定了.一只觉得lwip是一个不错的开放源码的tcp/ip 协议栈,想把自己对lwip的移植和理解写出来.但是由于最近比较忙,lwip的移植也是利用业余时间做的,今天写好了第一部分(lwip的 process model)先贴上来,如果大家有兴趣我再接着往下写.另外我的移植参看了skyeye扬晔大侠的代码,大家可以去看看扬晔大侠的lwip在ucos上移植的文章和代码.

【ucos+lwip应用心得】相关文章:

1.关于教师信息技术应用能力培训心得

2.中小学教师教育信息技术应用能力培训心得

3.商务礼仪应用

4.应用写作

5.应用系统开发单选题

6.数据库应用简历

7.建筑节能应用论文

8.数控技术应用自荐信

9.初中作文应用

10.信息技术应用工作汇报

下载word文档
《ucos+lwip应用心得.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度: 评级1星 评级2星 评级3星 评级4星 评级5星
点击下载文档

文档为doc格式

  • 返回顶部