搜档网
当前位置:搜档网 › OSAL解读笔记

OSAL解读笔记

OSAL解读笔记
OSAL解读笔记

A 先粗看了一些东西

如果某一个任务的event被置位了,就处理它。

即taskEvents[idx]!=0

而这个事件是由中断程序之类的设置的或者由某一任务设置的?

只有有events事件发生的任务才去处理。没有事件发生的任务将跳过。

系统信息,可能会发给本任务,这个用函数:

Osal_msg_receve(simpleosal_taskID)就可以得知。

猜想:当系统事件发生时,它会将一个全局变量中的事件数组的某一个与0x8000或运算,到底是哪一个就是我们的任务排列的序号来决定的,例如我们在本例子中有11个任务(后来我自已又加了一个)如果第2个任务要发系统信息运去,就将这个数组置为1。

程序中的这样处理的:

tasksEvents[task_id] |= event_flag; // Stuff the event bit(s)---见osal.c中。

这个信息处理函数(带任务ID参数)它就是读这个全局变量,看这个是发给谁的。

所以它先看有没有系统事件是发给本任务的,

uint8 *osal_msg_receive( uint8 task_id )

{

osal_msg_hdr_t *listHdr; ///队列指针,用于搜索的

osal_msg_hdr_t *prevHdr = NULL; ///前一个

osal_msg_hdr_t *foundHdr = NULL; ///发现的指针处

halIntState_t intState; ///这个不知是干什么用的

// Hold off interrupts

HAL_ENTER_CRITICAL_SECTION(intState); ////进入

// Point to the top of the queue

listHdr = osal_qHead; ////指向队列的前部

// Look through the queue for a message that belongs to the asking task

while ( listHdr != NULL ) ////只要队列不空,就一直往下走

{

if ( (listHdr - 1)->dest_id == task_id ) ///事件队列中的目标ID是指向本地ID否?

{

if ( foundHdr == NULL ) ///第一次发现消息是给自已的

{

// Save the first one

foundHdr = listHdr; ////发现一个消息是给自已的

}

else

{

// Second msg found, stop looking 又发现一个直接退出了

break;

}

}

if ( foundHdr == NULL )

{

prevHdr = listHdr; ///当前这个就是第一个

}

listHdr = OSAL_MSG_NEXT( listHdr ); ///指向下一个

}

// Is there more than one?

if ( listHdr != NULL )

{

// Yes, Signal the task that a message is waiting

osal_set_event( task_id, SYS_EVENT_MSG );

}

else

{

// No more 如果没有消息就告诉任务,现在没有系统消息

osal_clear_event( task_id, SYS_EVENT_MSG );

}

// Did we find a message?

if ( foundHdr != NULL ) ////将这个消息从中间抽出来让它消失掉,这时就要知道前一个{

// Take out of the link list

osal_msg_extract( &osal_qHead, foundHdr, prevHdr );

}

// Release interrupts

HAL_EXIT_CRITICAL_SECTION(intState);

return ( (uint8*) foundHdr );

}

B再看一下操作系统,从中断到处理的过程

现在基本理清了按键消息是如何发过来的,有点绕。

首先,在初始化中,允许了中断并配置了回调函数(这个函数在文件onBoard.c中InitBoard()

调用了它):

/* Initialize Key stuff */

OnboardKeyIntEnable = HAL_KEY_INTERRUPT_ENABLE;

//OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;

HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);---halkey.c中定义

在配置回调函数中,它初始化了两个键盘的中断允许位和上下沿等细节,将中断屏蔽位打开,且将这个中断标志位清除。注意到它将全局变量置为有效OnboardKeyIntEnable=1 而这个变量本来没什么意义的,但发现它可以用来读键盘中断位时,在区分是用中断方式来做还是用查询方式来做时用得着这个变量。

中断函数的定义有点小技巧(宏),它就是将中断矢量放到合适的位置,而且申明了这个函数。它既是定义,也是申明。这个在hal_mcu.h中定义了。(Keil和IAR不一样)

但是这个配置程序中可能有点错,PICTL是用来控制上升沿或下降沿中断的,在多功能键初始化中,即P2.0处理中,它错误将P2IEN的D3位置为1,而不是将PICTL的D3位置1。所以这个键变成了上升沿了。当然这并不影响程序的运行。下面我们看一下是上升沿还是下降沿。先看一下电路图按下去时,它会产生一个上升沿,仿真器调一下看是否是上升沿时中断?果然,在刚按下去,还没抬起来的时候,就捕获到一个中断了。这说明这个中断是上升尚的,证明了程序的配置下降沿是没成功的,看来TI也会出点小错误。

中断响应程序中,最后调用了:----中断函数定义在halkey.c中.

osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_V ALUE);将生成一个按键事件。注意到这个Hal_TaskID这个是内核ID的任务。延时一下可抗抖动干扰?注意到这个函数中调用了newTimer = osalAddTimer( taskID, event_id, timeout_value );

而这个加定时器这个函数,当时只是加了一个定时器,后面的事情,就是要延时一点时间后,等时间到了后再去设置它,这个终于发现了(在定时器更新中osalTimerUpdate())

当定时时间一到,就将事件发送给相应的任务ID

osal_set_event( freeTimer->task_id, freeTimer->event_flag );

所以是它将这个按键事件是发送给内核这个任务的。

注意到这里的任务ID,就是内核任务ID。而这个事件就是按键事件。

注意到在中断程序中,并不确定按键是哪一个,它是在HalKeyPoll()中检测键的。

而这个事件的处理在什么地方呢?

它在Hal_ProcessEvent( uint8 task_id, uint16 events )中。

这个是一直在调用的,它是11个运行的任务之一(事实上它是第2个任务)

在这个任务中,如果发现有系统事件,它会将这个事件读出来。没做什么事情,也不会有这样的系统事件(在我们这个程序中)

如果是按键事件,则调用HalKeyPoll()在这个函数中将检测这个键值传送到这个回调函数中。(pHalKeyProcessFunction) (keys, HAL_KEY_STA TE_NORMAL); 注意到第2个参数它=0 OnBoard_KeyCallback( uint8 keys, uint8 state )注意到这个state=0.

而这个shift的值为多少呢?如果不是SW6,它就是true.如果是SW6,它就是false.

shift = (OnboardKeyIntEnable == HAL_KEY_INTERRUPT_ENABLE) ? false : ((keys & HAL_KEY_SW_6) ? true : false); ---如果是单键,它为false,为5键,它就是true.

这个回调函数,调用了OnBoard_SendKeys( keys, shift ) 在这个函数中,它调用了:osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );

这个注册的任务ID,就是我们在初始化中指定的任务(最后一个任务ID)。而这个信息就含有我们的事件名,状态,键名称。

发送消息的函数调用了osal_msg_enqueue_push( destination_task, msg_ptr, FALSE)在这个函数的开始,将消息推送到消息队列中,osal_msg_enqueue( &osal_qHead, msg_ptr ); 最后调用了osal_set_event( destination_task, SYS_EVENT_MSG );即告诉目标任务ID,你的系统事件到了。

有一个问题是程序是如何按键去抖动的呢?例如由于抖动,发生了N次按键中断。难道就要加N个定时器吗?终于后来又发现了,它在osalAddTimer( uint8 task_id, uint16 event_flag, uint32 timeout )完美地解决了这个问题,这个问题就在这个函数中,当增加定时器时,如果发现同样的事件,同样的任务,已经有一个定时器在运行了,则我们就不会再增加定时器了,而是将这个定时器更新一下就可以了。而如果从来没有定时器用于这个事件和这个任务(两者同时符合,则不生成一个新的定时器)

newTimer = osalFindTimer( task_id, event_flag );

if ( newTimer ) ///如果发现了定时器已经存在了

{

// Timer is found - update it. ///只是将这个定时时间更新一下而已。

newTimer->timeout.time32 = timeout;

return ( newTimer );

}

Else ///如果没有这个定时器存在,就生成一个定时器

{

// New Timer

newTimer = osal_mem_alloc( sizeof( osalTimerRec_t ) ); ///分配一段内存

。。。。以下设置定时器的参数

}

真正的键的最后处理,交给应用层了。因为这个信息已经封装,发送到最未的一个任务了,消息中的事件就是KEY_CHANGE 它的状态就是true or false---这个依赖于是5键还是单个键。它的键名就是预定义好的6个键,分别为0x01,0x02,0x04....

后面还有注意到

tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);

分配的是一个2*事件个数的数组例如11个任务,就分配了一个22个字节的指针处。

它是一个int16的数组,每个位表示一个事件,每个任务最多有16个事件,其中的0x8000表示的是系统事件。即最高位为1的事件。

我们还要看一下这个始终运行的任务

do {

if (tasksEvents[idx]) // Task is highest priority that is ready. 注意到这个数组。它代表?

{

break;

}

} while (++idx < tasksCnt);

在什么地方设置这个呢?tasksEvents[idx]

uint8 osal_set_event( uint8 task_id, uint16 event_flag )

{

if ( task_id < tasksCnt )

{

halIntState_t intState;

HAL_ENTER_CRITICAL_SECTION(intState); // Hold off interrupts

tasksEvents[task_id] |= event_flag; // Stuff the event bit(s)

HAL_EXIT_CRITICAL_SECTION(intState); // Release interrupts

return ( SUCCESS );

}

else

{

return ( INV ALID_TASK );

}

}

C自已在工程中试着加任务,传事件和附加消息,还是成功了

下面,我们试着在一个工程中,加一个任务,这个任务让一个LED灯闪。且时间到了,就给主任务发送一条自定义的消息,此消息含一个变量,这个变量每次都++的。通过串口打印一个时间到了XX出来。

先加一个任务试试。

1.首先在任务组中增加一个函数MyTestEvent() 这个在OSAL_simpleBLECentral.c中。

2.

A 增加一个MyTest_Init(taskID );注意到前面一个任务必须将tasdID++;只有最后一个才不要++。simpleBLECentral.c中,这个是初始化的调用。

B 增加一个定义static uint8 MyTestTaskId; -----simpleBLECentral.c中。

C extern uint16 MyTestEvent( uint8 task_id, uint16 events );----这个在simpleBLECentral.h中要定义,同时要定义的还有extern void MyTest_Init(task_id) 不然编译会出警告

3.写这个初始化函数及处理函数

A初始化函数部分:它定义在simpleBLECentral.c中

先:HalLedSet( HAL_LED_2, HAL_LED_MODE_ON ); ///没什么事就让一个灯亮一下吧

#define START_TEST_EVT 0x01 -------------启动时加个事件试一下simpleBL...h

B处理函数部分:它定义在simpleBLECentral.c中

我们怎样来处理这件事呢?---简单一点

这样行不行?先在初始化中,增加一个定时器事件。

在这个任务中,在收到定时器事件后,让灯反转一下,并重新开启一个定时器事件。这样灯就不停地反转了。不这么做。

复杂一点,就是先调用这个函数:

osal_start_timerEx (Hal_TaskID, HAL_TEST_EVENT, HAL_KEY_DEBOUNCE_V ALUE);

我们先将一个事件,发给内核任务去处理

#define HAL_TEST_EVENT 0x1000 -----这个定义在hal_drivers.c中

于是,在内核中就要增加对这个事件的处理。但是这个处理很简单

我们知道,这个HalKeyPoll()总是要在按键被调用的。这个是有按键事件发生时才调用,所以不能将这个事件处理放在这里。

但是我们在Hal_ProcessEvent()中处理这件事情的。于是我们将这个事件放到这里来处理,在这个函数中增加对这个的处理部分。原来键处理是在回调函数中处理的,我们直接。。。但是有一个要定义一下,就是定义一个时间到事件

#define TIMER_ARRIVED 0xC1 //gxd 2015/11/25

下面我们再总结一下这个过程。

1.初始化时,我们先给这个我们加的这个任务,即其ID号为MyTestTaskId,其运行的任务名为:MyTestEvent的这个任务,发送一个事件:(事件定义在simpleBLECentral.h文件中)osal_set_event( MyTestTaskId, START_TEST_EVT ); 启动测试事件,因为这个任务中也没有什么其它事件,故我们就将这个事任定义为0x01 我们知道它最多有16个事件。一般来说,这个0x8000就是系统事件。注意到每个任务都有自已怕系统事件。系统事件不是唯一的。

2.这个任务一旦运行,马上就会收到这个事件。在收到这个事件后,会向内核中的HAL事件处理程序发送一个延时后的事件

osal_start_timerEx (Hal_TaskID,HAL_TEST_EVENT, HAL_TIMER_DEBOUNCE_V ALUE);

3.内核程序是专门处理这个事件的。所以过一段时间,就会收到它,这个时间长度为1000。单位是多少呢?需进一步了解----发现它的单位是ms 看函数定义中的注释中有。

4.内核事件处理程序中,会直接调用Test_Send( 0, 0 );这个函数。这个函数将调用:

osal_msg_send( MyTestTaskId, (uint8 *)msgPtr );即给MyTestTaskId发送一个信息。

注意看到原来键中断处理却不是这样做的,它原来的方法是在中断中,给内核任务发送一个键事件,在这个键事件处理中,调用keyPoll()中将键值得到,然后调用一个回调函数---我们预定定义好的。在这个回调函数中,调用了OnBoard_SendKeys()这个函数,在这个函数中给我们的这个任务发一个系统消息,且将消息设置了一下。

osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );

而现在的做法是直接给测试任务发一个消息。

5. 于是我们的测试任务就会收到这个消息,而且是个系统消息。收到这个系统消息后,系统消息中的事件是TIMER_ARRIVED 调用这个My_TEST_ProcessOSALMsg()这个消息。在处理这个消息过程后,将销户这个消息。

6.在销户了这个消息之后,为了让这个过程不断地进行下去,我们再给内核发送一个测试事件。于是这个过程继续下去。

发现这个延时启动的计时器的单位为ms.故我们将这个时间定为1000。

发现加了这部分程序后,系统就死机了。跟踪发现信息没有发送过去。

后来发现程序将事件名称写错了,拷贝时忘记改引起的,修改后好了。

串口经常少打一个回车。而且是每打印5次就会发生这样的错误一次。这个不知所以了?

D 试着理解一下BLE协议部分,感觉有点乱

下面再继续读一下其它的代码部分

先看系统事件,它处理按键和GA TT消息部分。

先看简单点的,消息处理:消息处理就是读写部分,当读或者写指令发出后,它在交给无线部分收发后,完成后会有响应,这个响应有4种情况,读错误,写错误,读成功,写成功。下面具体看一下这个处理:

如果没有建立连接,则直接返回,这个可理解。

如果是读响应,(读出错不在这里)或读请求则有:

uint8 valueRead = pMsg->msg.readRsp.value[0];

证明这个消息中含有读的值。这个消息格式如下:

typedef struct

{

osal_event_hdr_t hdr; //!< GATT_MSG_EVENT and status

uint16 connHandle; //!< Connection message was received on

uint8 method; //!< Type of message

gattMsg_t msg; //!< Attribute protocol/profile message

} gattMsgEvent_t;

如果不是读,也不是写,而且正在忙的话,就是在做发现的事情。例如,在接到发现从机事件时,就将这个状态改变成正在发现状态:simpleBLEDiscState = BLE_DISC_STA TE_SVC; 此时就不是闲了。而如果有消息过来,要不就是读,要不就是写,要不就是在发现。

所在在收到了系统消息后,一个看这个消息是不是按键消息,一个看消息中附加的事件是不是GATT消息,如果是GATT消息,则进一步看是读还是写还是其它。其它只有一种情况就是发现消息。而这个发现消息也是因为按了UP键引发的。

最后我们还是看一下键处理,尽管这个键处理比较复杂一些。

●先看UP键。如果没建立连接,就调用一个函数去发现从机扫描。如果正在扫描时按下UP键,就终止扫描了。不过除非你连接按两下UP,不然因为连接速度很快,不会出现终止扫描这种情况。

如果已经建立连接了,按UP键的话就是一次是写,一次就是读,一直按一直这样做下去。

●再看一下左键处理。

显示扫描到的设备号。按一下换一个,直到最多8个又回来了。

●再看右键是连接更新。这个不知在做什么,因为源代码看不到在库里。

●再看中心键,如果选择要连接的从机是空闲状态,还没有进行连接,则进行连接,如果已经是连接状态,则断开连接。

●再看DOWN键,每按一次,是读取RSSI或取消读取RSSI。

注意到扫描和连接是两件事情。扫描只是看下面有多少从机。而连接则是给指定的从机去连接。连的是谁则通过左键去选。做试验时我们只有一个从机,只买了一个。

程序还是没有看完全,还得继续努力去消化一下。只有多花时间多去看,对代码看上去就记住得差不多的时候,这个代码也就看得差不多了。这样下来速度是慢了点,但是比较深入一点。

我们再一次将客户机(中心)这个程序解读一遍:

先看在这个事件处理程序:它处理三种事件,第1种是系统事件,第2种是启动事件,第3种是开始发现事件。

简单点的先看第3种。第3种是一个开始发现事件。我想这个开始发现事件应该是按了UP 键后发出的吧。本来也没有必要搞这么一个绕来绕去的,在按键中直接调这个函数simpleBLECentralStartDiscovery( );不就行了吗?我们看一下在什么地方触发了这个事件?static void simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )中调用了这个事件。

在GAP_LINK_ESTABLISHED_EVENT事件中,发调用这个

osal_start_timerEx(simpleBLETaskId,START_DISCOVERY_EVT,

DEFAULT_SVC_DISCOVERY_DELAY );

照理,我们应该在UP键中会出现这个发现设备事件?

理解错了,原来这个是发现FFF0服务?而不是发现从机。原来是与从机建立连接后,再启动这个发现从机服务的过程,而不是扫描从机。注意到这里发现FFF0服务的服务。下位机如果有N个,则怎样去发现呢?另外每个下位机它的服务都是FFF0吗?

我估计下回还要看一下同时连接3个从机的例子能从中间找点线索吧。

调用了这个发现从机服务后,还要做什么呢?此时应该可以与服务器的特征参数通讯了吧?只能先跟踪到这里了。过一会再来回顾这部分的处理吧。

接下来我们看到第2种事件,就是启动事件,启动事件由这个任务的init()的。

启动事件中,也做了不少事情的,主要有:

注册了两个函数,其中一个是RSSI事件处理回调函数和一个状态处理回调函数,也就是收到一些事件后,如何处理收到的事件消息。

绑定处理函数,这个可能是处理密码与配对的吧。也是一个回调函数。

于是我们再稍深入一点,看RSSI函数回调到底做了些什么?

RSSI回调函数,就做了一件事,将RSSI的值显示在屏幕上。

事件处理函数有点比较复杂,它的目的是处理一些事件:

GAP初始化完成事件,初始化完成后,将信息在屏幕上显示出来。

设备资料事件:在一个给定的广播的服务UUID列表中,发现一个给定的UUID(FFF0吗?)设备发现事件:在屏幕上显示设备发现,和去选择这个字样。

建立连接事件:它会调用一个osal_start_timerEx( simpleBLETaskId, START_DISCOVERY_EVT, DEFAULT_SVC_DISCOVERY_DELAY );生成一个事件,然后由任务中去开始发现指定的从机。这个有点象是建立连接?

断开连接事件:显示连接被断开。

参数更新事件:就是显示一个para,update在显示屏上。

接下来我们看比较麻烦的最后一个,就是系统事件。系统事件含两种消息处理,一种是按键消息处理,一种是GATT消息处理。其中GA TT消息处理有三种情况,读,写,不闲着。前两种比较简单一点,就是从自带的消息中将字符取出来。并显示在屏幕上。

后面一个就调用这个函数:simpleBLEGATTDiscoveryEvent( pMsg );

这个函数处理GATT发现函数。这个函数中,处理两种情况,一种是服务发现,一种的特征发现。在特征被发现后就将它进入空闲状态。

服务发现干些什么事呢?当一切顺利时,就将状态置为特径发现,便于下一次来处理。

将FFF1这个值会设置进去,也就是说好象只对FFF1进行操作。

特征发现,保存处理句柄,这个没理解。等待以后理解吧。

最后看一下键盘处理吧:

UP键,是去扫描用的。调用了一个GAPCentralRole_StartDiscovery函数。如果已经连接,则分别去写,读这个相关联的句柄中的某一个字符。但只是进行读写动作,读写完成后自然会在一个回调函数中处理的。simpleBLECentralProcessGA TTMsg()会有GATT事件消息产生的。

LEFT键---显示多个下位机设备。每按一次,显示一个。直到。。

右键:更新连接------不知道这个是做什么用的。

中间键:相当于一个回车键,它是确认它或者是断开连接。

下键:它不断地显示这个RSSI值。再按一下,就是不再显示了。

初步看完来,再自上而下看一遍代码

看到simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )这个函数理解一下。

这个函数在GATT事件中,当不是读,也不是写时,而且也不是闲时,就会调用这个函数去处理这个消息。我们知道系统消息有两个,一个是按键消息,一个是GA TT消息。GATT 消息应该是由于操作按键引起的。

当simpleBLEDiscState != BLE_DISC_STA TE_IDLE时,表示它的发现状态处理空闲时,但却有系统事件传过来,说明此时就是发现事件要处理了。发现状态有三种状态,一种是空闲,一种是发现了服务,一种是发现了特征值。

建立连接失败了,就将这个置为空闲了。

终止连接了,也将这个标志置为空闲了。

调用发现FFF0的服务,则这个标志置为BLE_DISC_STA TE_SVC---这个是唯一一个给值的发现服务成功了(完成了),就将这个标志置为BLE_DISC_STA TE_CHAR

发现特征后,就将它又置为空闲了。

什么时候会调用发现FFF0服务呢?这个在事件处理中,当( events & START_DISCOVERY_EVT )时,就会调用发现FFF0这个服务。

哪这个事件又由谁触发的呢?这个是由建立连接事件引起的。建立连接又是由谁引起的?这个是由按下中间键引起的。于是整个流程就比较清楚了。

E总结很重要,这里有点不乱了

这样总结一下:

●先是按下了UP键,开始扫描下位机。而且将搜到的下位机可以全部显示出来,这部分当前还没有读到。(稍后再继续读下去余下的代码也许就明白了)

●然后是左键可以选择指定的下位机。按左键时有simpleBLEScanIdx++,这个非常重要。

这个是选定要连接的从机中的哪一个从机用的。非常重要。

●接下来,再就是按下中间的键,就可以对指定的下位机进行连接。这个指定的从机就是用这个simpleBLEScanIdx数来代表的,这个是序号,又一次很重要。

在对下位机进行连接过程中,会调用下列函数:

GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,

DEFAULT_LINK_WHITE_LIST,

addrType, peerAddr );

注意到这个参数地址类型,对方地址。这个是对指定的从机进行连接。

peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;

addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;

下位机的地址及类型,是从一个设备列表中找出来的。而其中有一个比较重要的量就是:simpleBLEScanIdx,这个变量就是我们选定的要连接的下位机的设备序号。而这个序号又是怎么来的呢,是按左键选定得来的。至于它总共有多少个下位机被发现且放到列表数组中这个暂时不考虑。等一会看完所有的代码,也许自然就知道了(又一次轻轻放下它再说,人生需要先放下很多次,不然脑袋就乱了)。

●当调用了上面的“中心角色建立连接”函数后,我估计它会产生一个事件,就是GAP_LINK_ESTABLISHED_EVENT。这个事件是由回调函数处理的。因为我们在一开始启动了一个中心角色的设备的时候,就将这个回调函数附着上去。建立连接后,它会推一个定时器延时的事件产生(当然这里还有很多其它的事件会产生,这只是其中的一个),它就是osal_start_timerEx(simpleBLETaskId,START_DISCOVERY_EVT,

DEFAULT_SVC_DISCOVERY_DELAY );

●因此过一会儿,也就是1秒后,它会给我们的任务发现一个事件,这个事件就是开始去发现服务和特征值。我们的主任务在收到这个事件后就会调用:

simpleBLECentralStartDiscovery( ); ///调用发现从机函数

在这个函数中,我们只查找FFF0的服务。

simpleBLEDiscState = BLE_DISC_STATE_SVC; ///现处于发现服务状态这个重要!// Discovery simple BLE service 这个函数在库里面,其它地方好象找不到

GATT_DiscPrimaryServiceByUUID( simpleBLEConnHandle,

uuid, ////FFF0

A TT_BT_UUID_SIZE, /// 2

simpleBLETaskId ); ///由哪一个任务ID去处理的这里特别注意到第一个参数:simpleBLEConnHandle,它是在建立连接时被设置的。即按下中心键后,产生了连接事件,在这个事件中被设置的。

于是我们就是处理这个发现过程,而这个发现过程会引起系统事件,并附加有消息,这个消息的处理用这个函数来处理的simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )中间非读,非写的部分。

●调用了这个函数后,就会产生一些系统消息,这个系统消息不是按键消息,它的事件而是GATT_MSG_EVENT。于是我们就要处理这个消息了。这个GATT_MSG_EVENT有三种可能性,一种是读,一种是写,一种就不是读也不是写,它就是去将消息处理一下

if ( simpleBLEDiscState != BLE_DISC_STATE_IDLE ) simpleBLEGATTDiscoveryEvent( pMsg );

●在发现完成后,它会将simpleBLEDiscState = BLE_DISC_STATE_IDLE等于空闲的,后面读或写时就不会跑到发现这个地方去了

●到了这一步,就可以对读写的特征值进行读写了。而对这些特征值的读或者写,不会马上

就有结果的,而是要通过空中无线协议栈去完成,完成后有消息返回来的。此时才正式确认读写成功。

F 再回头来从头到尾将这个主任务看一遍,有点看懂了

于是以上过程就基本分析完成了一半多,还有一些分析过程放下了没来得及分析。

在这种情况下,再从头到尾将程序读一遍,以便为未读完的部分做点准备。

█仔细看一下UP键的处理有几个问题:

GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,

DEFAULT_DISCOVERY_ACTIVE_SCAN,

DEFAULT_DISCOVERY_WHITE_LIST );

在初次按下UP键后,会调用上面这个函数中心角色启动发现,也就是启动扫描。

另一个问题是,在此连接情况下按下UP键,将分别进行读,写操作。这个读写操作的句柄是怎么来的呢?req.handle = simpleBLECharHdl;---这是写时,要得到这个句柄才能写。

另外还有一个通讯句柄,也要的,如下:

status = GATT_WriteCharValue( simpleBLEConnHandle, &req, simpleBLETaskId );

一个是特征值句柄,一个是通讯句柄。两个都要的。

此外还要注意到这两个函数都是封装在库里的。它必然产生一些消息或事件给我们的函数来处理。因为它是提交给无线栈了,处理完后有信息返回的,一般是成功或失败。

具体的我们先看到这,只是提出问题,后面的函数自然会回答的。

再看一下左键做了些什么?左键看上去好象是选择某一个下位机连接的。它负责的是将这个变量simpleBLEScanIdx++。这个变量是一个非常重要的变量。

右键,似乎更新连接:

GAPCentralRole_UpdateLink( simpleBLEConnHandle,

DEFAULT_UPDATE_MIN_CONN_INTERV AL,

DEFAULT_UPDATE_MAX_CONN_INTERV AL,

DEFAULT_UPDA TE_SLA VE_LATENCY,

DEFAULT_UPDATE_CONN_TIMEOUT );

中间键比较重要,它用于连接或断开与某一个下位机的连接。

如果simpleBLEState == BLE_STA TE_IDLE这个状态是空闲的,已连接,正在连接,正在断开4种可能性之一。

将对某一个进行连接:

peerAddr = simpleBLEDevList[simpleBLEScanIdx].addr;

addrType = simpleBLEDevList[simpleBLEScanIdx].addrType;

simpleBLEState = BLE_STA TE_CONNECTING;

GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,

DEFAULT_LINK_WHITE_LIST,

addrType, peerAddr );

这里,用到了simpleBLEScanIdx很重要的变量,即已经扫描到的某个下位机。

而DOWN键,则决定是否显示RSSI信号强度。

█接下来的一个函数,是处理系统事件,加上附带的消息。

它是因为操作了键引起的。例如,UP键进行了读写,于是最后会触发到系统消息过来。UP

中间键,建立连接,也会有系统消息传过来。

建立连接时,只有当simpleBLEDiscState != BLE_DISC_STATE_IDLE才会去处理,哪么这个simpleBLEDiscState 什么时候给个值呢?原来在

void simpleBLECentralStartDiscovery( void )中,给过这个值

那又是谁在调用这个函数呢?这个在主任务的一个事件发生时,才会调用这个值,哪个这个事件START_DISCOVERY_EVT是谁给的呢?原来的建立连接时给的。哪么为什么会有建立连接这个事情发生呢?肯定是因为按下了中间键引起的。这里就能说得通了,由于按下了中间键,从而调用了一个建立连接的函数,而这个函数就会给一个回调函数发送一个事件,这个事件就是建立连接事件,这个事件中会产生一个开始发现事件给主任务,主任务在这个事件中会调用开始发现这个函数,开始发现这个函数会将这个simpleBLEDiscState 这个变送置为非空闲。非空闲就会去处理simpleBLEGATTDiscoveryEvent(pMsg).而这个函数会发现服务,发现特征量,发现完后会将这个变量置为空闲。发现服务和发现特征量时,会给句柄赋值?居然没发现,哪到底在哪里给这些句柄赋值的呢?

在建立连接时,就将通讯句柄赋值了:

simpleBLEConnHandle = pEvent->linkCmpl.connectionHandle;

///在建立连接事件时,将当前的连接句柄

simpleBLEProcedureInProgress = TRUE; ///设为当前的处理句柄

而在发现特征量时,有下列:

simpleBLECharHdl = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],

pMsg->msg.readByTypeRsp.dataList[1] );

于是给这个特征量赋值了。

因此,这个回调函数是用来处理这个发现事件的,即发现某一指定的下位机的服务和特征。它这里又是一个状态机来处理的。发现服务和发现特征是分两步完成的。

█下面仔细看一下这个回调函数,这个回调函数处理的不是主任务的系统事件,也不是主任务的其它事件,而是它内部的一些事件,这些事件,是由于启动了这个主机引起的,即我们在主任务开始时为响应这个events & START_DEVICE_EVT,启动了下列:VOID GAPCentralRole_StartDevice( (gapCentralRoleCB_t *) &simpleBLERoleCB );

// Register with bond manager after starting device

GAPBondMgr_Register( (gapBondCBs_t *) &simpleBLEBondCB ); ///让绑定自动处理启动了设备,也注册了绑定过程。

绑定过程在本例子中没做什么事,因为我们将它设为无需密码可直接连接的。

事实上,发密码过去是发一个随机的数过去。下位机我们已配置成无需密码连接了。

这个回调函数有几个事件要处理:

1. 初始化完成事件,此时就将本机的地址显示出来就可以了。什么时候调了一个初始化函数呢?在设置回调函数时就初始化了。

2. GAP设备资料事件在发现这个下位机资料后,将这个下位机的信息加进去,特别注意到simpleBLEScanRes++;将这个总共发现了多少个设备++一下。这里可能以后很有用的,因为以后用手机对多个下位机时,已经设置过的我们就不要再去设置它了,而且在扫描到这些下位机时,直接将它跳过去。但是扫描到的下位机怎么识别呢?下位机总有一个地址的,可以供识别的。另外,它还有字符串吗?(名称,不过名称也许是一样的,我们也许只扫描一类名称,别的名称如耳机就不要管它了,是不是可以这样?)另外在哪里发现它的名称呢?这

个本该是扫描时的工作吧。每扫描到一个下位机从设备,我们就会出现这个事件。

3. GAP_DEVICE_DISCOVERY_EVENT-----这个有点象设备扫描结束了时出来的这个事件。因为我们看到它将扫描完成后的通道数放到simpleBLEScanIdx = simpleBLEScanRes;

而这个simpleBLEScanRes=pEvent->discCmpl.numDevs;

所以感觉到它是扫描完成了调用的似的。

4.GAP_LINK_ESTABLISHED_EVENT 建立连接事件,这个前面已经分析过了。这里有:simpleBLEState = BLE_STA TE_CONNECTED;

simpleBLEConnHandle = pEvent->linkCmpl.connectionHandle; ///在建立连接连接句柄simpleBLEProcedureInProgress = TRUE; ///设为当前的处理句柄

我们在这个地方,将当前通讯句柄得到了。很重要的一个句柄。

5.GAP_LINK_TERMINATED_EVENT 这个就不多分析了。

6.GAP_LINK_PARAM_UPDATE_EVENT这个没做任何不处理。

G 我只能说,初步的理了一遍,该看的都看过了,基本理解了。

我现在想找到从机名称,看在这个事件中能否找出来,主要看两个事件,最主要是看GAP_DEVICE_DISCOVERY_EVENT和GAP_DEVICE_INFO_EVENT

先看第一个,将断点设在此。但是由于调试器看数据结构很不方便,没有发现这个下位机的名称。但总是会隐在某个地方的。

为此,我们再看一下从机的程序吧。从机是我们真正要做的,主机实际上是手机。要了解主机部分,还需要再看一下BTOOLS运行部分的程序看一看。

从机看过了,没有什么收获。

要不再看一下HostTestRelease 看从中能看出点什么过来。我想这个程序中应该通过串口给主机一些指令,主机随后根据这些指令去执行,应该可以看出点更详细的东西出来。

但是很难看下去。所以又转换一下思路:

看一下这个一拖三的系统处理过程:

1.首先按下UP键,此时将调用下列函数:

GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE, ///启动扫描

DEFAULT_DISCOVERY_ACTIVE_SCAN,

DEFAULT_DISCOVERY_WHITE_LIST );

这个就是开始扫描,并不是开始连接

2 开始扫描后,所有事件将由这个处理

simpleBLECentralEventCB( gapCentralRoleEvent_t *pEvent )

每扫到一个设备,就会有这个事件产生:GAP_DEVICE_INFO_EVENT此时我们看到可以打印扫到的这个设备及它的RSSI。正是在这里,本来想在这里将RSSI比较大的扫描的连接上,小的就不要连上了。但是后面发现这样不行,因为在扫描完成后,即GAP_DEVICE_DISCOVERY_EVENT后,它有下列处理:

simpleBLEScanRes = pEvent->discCmpl.numDevs; ///发现了多少下位机将总数设置一下

osal_memcpy( simpleBLEDevList, pEvent->discCmpl.pDevList,

(sizeof( gapDevRec_t ) * pEvent->discCmpl.numDevs) ); ///全部拷进来了

当然,我们可以不管这个,将它删除后看一下是否不处理这个事件会有什么结果。如果可以不管这个,我们就可以将以前处理过的(因为我们已经得到了地址,处理过的保存起来了,我们总是在不停地扫描,看有没有新的进来,有新的进来就给它建立连接,已经处理过的就终止连接)

3.到此为止,程序将什么事也不做直到按下了中心键后,一键连接。

首先调用这个函数:performPeriodicTask_AutoConnect()这个函数主要的工作就是将第一个扫描到的下位机的地址取出来,且执行:

GAPCentralRole_EstablishLink( DEFAULT_LINK_HIGH_DUTY_CYCLE,

DEFAULT_LINK_WHITE_LIST,

addrType, peerAddr );

注意到取的地址为序号为simpleBLEScanIdx,而这个值在什么地方置0了?检查一下正是在设备扫描完毕后,将这个值置为0了。

4.调用这个函数后,将传一个事件:----自动连接事件,但是这个事件在1.6秒后才发生。osal_start_timerEx(simpleBLETaskId,SBP_AUTO_CONNECT_EVT,

SBP_PERIODIC_EVT_AUTO_CONNECT );

5.此时面临两个事情要做,一个是建立连接,将会产生连接事件,另一个是主任务要去响应这个自动连接事件。看它们是如何处理的?注意到这个自动连接事件延时了1.6秒。比较长,在这种情况下,应该建立连接这个事件早就执行了,故执行连接会被先响应。于是有

GAP_LINK_ESTABLISHED_EVENT事件发生。看在这中间发生了什么?在这里同样用到了关键变量:simpleBLEScanIdx。先将连接的句柄保存下来--这个很重要。然后将特征量句柄清0,这个句柄将在未来的某个地方设置。然后它将发送下列:

osal_start_timerEx(simpleBLETaskId,START_DISCOVERY_EVT,

DEFAULT_SVC_DISCOVERY_DELAY );

发送一个开始发现事件给任务注意到这个延时仅为1ms基本上就是立即发送了。注意到在这里,这个变量simpleBLEScanIdx并没有++。

6.主任务在接到这个事件后,即调用simpleBLECentralStartDiscovery()这个函数的作用是p->simpleBLEDiscState = BLE_DISC_STA TE_SVC; ///状态改为正在发现服务GATT_DiscPrimaryServiceByUUID( p->simpleBLEConnHandle,

uuid,

A TT_BT_UUID_SIZE,

simpleBLETaskId );

下面这个函数是一个库函数,表示开始进行服务发现。

7 在服务发现期间,会反复的自动调用:

simpleBLEGATTDiscoveryEvent( gattMsgEvent_t *pMsg )

这里是这样处理的:先将起始句柄和未了句柄设置一下,这个看上去我们没有用到它:

p->simpleBLESvcStartHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].handle;

p->simpleBLESvcEndHdl = pMsg->msg.findByTypeValueRsp.handlesInfo[0].grpEndHandle;

p->simpleBLEDiscState = BLE_DISC_STATE_CHAR1;

req.startHandle = p->simpleBLESvcStartHdl;

req.endHandle = p->simpleBLESvcEndHdl;

req.type.len = A TT_BT_UUID_SIZE;

req.type.uuid[0] = LO_UINT16(SIMPLEPROFILE_CHAR1_UUID);

req.type.uuid[1] = HI_UINT16(SIMPLEPROFILE_CHAR1_UUID);

GATT_ReadUsingCharUUID( p->simpleBLEConnHandle, &req, simpleBLETaskId );

然后去发现这个特征值1。

后来,得到了特征值1的句柄:

p->simpleBLECharHdl[0] = BUILD_UINT16( pMsg->msg.readByTypeRsp.dataList[0],

pMsg->msg.readByTypeRsp.dataList[1] );

后面又去发现特征值6,在发现后又得到特征值6的句柄。

此时,第1个设备的连接就完成了。接下来,开始要连接第2个设备。

这时,1.6秒也已经到了,出现事件SBP_AUTO_CONNECT_EVT,于是会出现下列现象,如果simpleBLEScanIdx=simpleBLEScanRes 表明已经连上了所有的扫描到的从机,此时就会退出,再也不会进行连接动作了。

这里我们特别注意到simpleBLEScanRes 这个值,它在扫描事件中被设置了的。这个在扫描完成后设置了,而不是在GAP_DEVICE_INFO_EVENT中进行任何处理,故如果只用这个GAP_DEVICE_INFO_EVENT的话,就会出问题的。除非将这个值进行++处理。

如果没有完成,则会simpleBLEScanIdx++。这个很重要。然后它会:performPeriodicTask_AutoConnect(); // 执行动连接

osal_start_timerEx(simpleBLETaskId,SBP_AUTO_CONNECT_EVT,

SBP_PERIODIC_EVT_AUTO_CONNECT );

这时,又会执行一个建立连接的动作。注意到在前面按下中间键时,已经进行了这个动作。于是最后将所有扫描到的都连接上了。如果在此期间,有连接的失败的,将这个值:p->simpleBLEState = BLE_STA TE_CONNECTED;

不会被设置。并且将这个p指向的结构设置为初始值。此后在发数据时就不会乱发了。

注意到断开连接时,这个simpleBLEScanIdx并没有--。即在设备列表中并没有去掉这个值。

8.如果一切顺利,这个设备都连接好了,且连了3个。当然如果设备本来少于3个,就按实际个数连接。

9.接着等按键操作了。先看几个简单的。比如按下down键。把所有的已经建好连接的下位机的RSSI回调函数激活或取消。

GAPCentralRole_StartRssi( p->simpleBLEConnHandle, DEFAULT_RSSI_PERIOD );// 关键

为了达到轮流激活取消的效果,用到了p中的一个变量p->simpleBLERssi来进行判断。

10.如果按下了左键,而且不是在扫描状态,即扫描完成了,就是显示各个下位机的地址。注意此时这个simpleBLEScanIdx++; 所以如果在按下中间键之前,按了左键,这个值就会变掉。到时,如果没有按中间键就去按这个左键,这个程序感觉要出错似的?不过不会了,因为在按下中间键时,会将这个值清0的。

11.如果按下了右键,这个是去更新参数,暂时不管这个了。

12.如果按下了开发板上的S1键,这个才是最复杂的,要开始发数据了。

osal_start_timerEx(simpleBLETaskId,SBP_PERIODIC_EVT, SBP_PERIODIC_EVT_PERIOD ); 这个就是每0.4秒调用一次。

实际上是执行了下列函数:

OneConnetedDevice_WriteCharX(simpleBLEScanIdx, BLE_CHAR1,&simpleBLESendV alue, 1); 第一个参数是当前的连接下位机号,第2个参数是特征值,第3个是要发送的字符,第4个是长度。这里先给特征值1写一个字节下去。随后这个值++。

然后就是往特征值6发送一个字符串:

OneConnetedDevice_WriteCharX(simpleBLEScanIdx,BLE_CHAR6,(uint8*)str, osal_strlen(str)); 这个串有几个字符,它含义为“time=%06ld”注意到发送完后,有simpleBLEScanIdx++;

GA TT_WriteCharV alue( p->simpleBLEConnHandle, &req, simpleBLETaskId );

发送完后,应该有返回结果看一看吧。

事实上,发送完的结果在

void simpleBLECentralProcessGATTMsg( gattMsgEvent_t *pMsg )中得到体现的:

LCD_WRITE_STRING_V ALUE("Writesent:", simpleBLESendValue, 10, HAL_LCD_LINE_1 ); 但是这里好象只处理了特征值1的部分,对于特征值6的部分没有处理。

事实上,我们要找到这个BLE_DEV *p = simpleBLECentralGetDev(pMsg->connHandle);

即找到下位机的设备列表中的句柄。但没有去找特征,是特征1还是6好象没办法分辩出来。这里暂时跳过吧。

13.有一个地方没有理解,就是在这个GATT事件处理中,有下列:

else if ( p->simpleBLEDiscState != BLE_DISC_STATE_IDLE )

{

simpleBLEGATTDiscoveryEvent( pMsg );

}

于是整个程序都读了一遍,再回顾一下。

看一个简单的,给几个已连上的下位机发数据部分:

这个程序没有对是否连上作出判断,不管后来下位机是否关机,反正都是往下位机发送,而且也没有个停止机制不停地发。正式程序似不能这样。应允许关掉下位机。

再看一个连接performPeriodicTask_AutoConnect()

注意到如果已经连接,或者正在连接,或者正在断开连接,这三种情况下,都会调用断开连接这个函数。

gStatus = GAPCentralRole_TerminateLink( p->simpleBLEConnHandle );

注意到这个断开连接中,带有一个参数,就是连接句柄,故断开连接它是断开某一个下位机的连接,而不是断开所有的连接。

在空闲时,会调用建立连接这个函数。于是在事件处理函数中(不是本任务的事件处理,而是回调函数的事件处理)会处理一切事宜。再往下看这些连接事宜是如何处理的。

建立连接事件中,会先将这个下位机的连接句柄保存下来,然后,调用:

osal_start_timerEx(simpleBLETaskId,START_DISCOVERY_EVT,

DEFAULT_SVC_DISCOVERY_DELAY );

于是会有一个发现事件发到我们的主任务中。

在这个任务中,会处理这个

p->simpleBLEDiscState = BLE_DISC_STA TE_SVC; ///将这个状态变为发现服务GATT_DiscPrimaryServiceByUUID( p->simpleBLEConnHandle,

uuid,

A TT_BT_UUID_SIZE,

simpleBLETaskId );

调用这个后,将GA TT事件中,产生一个调用,而这个调用中,有读,有写,除这两个之外的就是发现服务,还有一个就是下位机往上发的通知。

p->simpleBLEDiscState != BLE_DISC_STATE_IDLE时,它就是表示要进行发现服务工作。因为我们在建立连接时,会将它设为SVC。

再理一遍:

A再看一下,这个建立连接,是被按下中心键触发的。在按下中心键时,我们就将这个序号置为0了(IDX)。

B于是,在回调函数中就会有建立连接的响应。于是在这个响应中,将把这个句柄保存下来。且将特征值句柄清0,然后调用发现服务事件被发送到主任务中。主任务收到这个事件后,调用发现服务(当然,先将这个状态变为发现如上文中的兰色字符)

C 在GA TT事件中,会有反应,主任务中,会有系统事件发过来,它们不是按键事件,而是另一个GATT事件。在这个事件处理中除了读,写,下位机往上发之外,因为你已经将这个变成兰色部分了,因此,它就会去调用这个函数:

D simpleBLEGATTDiscoveryEvent(),正是在这个函数中,得到特征1和特征2的句柄的。注意到我们这里并没有用到IDX这个变量,而是在这个发现服务这个值中,它的pMsg中含有连接的句柄,通过这个句柄,找到我们要处理的下位机,而不是依靠IDX去找下位机。再看兰色字符处的设置SVC,在什么地方改回IDLE的呢?正是在发现了特征6之后,再p->simpleBLEDiscState = BLE_DISC_STA TE_IDLE;了。

E 在第一个下位机完成之后,又怎样接着去发现第2个呢?原来是按下中心健后,

osal_start_timerEx(simpleBLETaskId,SBP_AUTO_CONNECT_EVT,

SBP_PERIODIC_EVT_AUTO_CONNECT );

产生了一个自动连接事件引起的。这个自动连接事件会不断地调用

performPeriodicTask_AutoConnect(); // 执行动连接--不停地进行除非。。。直到原来扫描到的3个从机都连完了。

现在再来看一个手机综合的例子,这个例子是手机为上位机,我们只编写下位机程序。测量温湿度,控制开关状态及测量AD值。这与我们的应用比较符合的。

先看广播信息:FFF0 09错?

我们得到下列广播信息:? ? ? 1+a

02 01 06 0b 52 45 4e 59 57 45 4c 4c 02 f0 ff0b 09 41 6d 6f 53 6d 61 72 74

R E N Y W E L L A m o S m a r t

52 46 05 12 06 00 06 00 02 0a 后面全是0

R F

兰色部分是广播数据:advertData[] 0b指的是扫描数据

这样看来,广播数据并没有含MAC地址和RSSI部分,它只含有几个简单的信息。如果上位机不扫描,则它就不会有进一步的信息了,所以,我们如果想决定是否和它连接,必须在这个广播包中,就将一个我们规定的地址发出去。不然没办法筛选。因为连过的东西我们不想再连接了。这样看来,我们要在广播包中含有一个唯一的编码。这个编码可以是MG0001,这个都是不可修改的。手机的APP可以设为只去扫描编码前为匹配的才会去连接,而且,已经连过的也不会再去连接。

下位机在连接好之后,先进行AD转换,同时等上位机的命令。:

下位机编码规定如下:

XX X XXXXX

产品名称两位产品类别地址最多99999个

类别:1--4~20mA 2--0~5V 3 0~10V 4 串口

上位机可对下位机进行配置,如果为模拟量,则配置命令为:

参数名称参数量程(即满量程为多少值)串口命令串位置描述字符串

这4个参数都是以长度+参数来表示的。支持双字节的汉字。

例如参数名称为pm2.5 1000ppm 无轧钢一厂3车间1号鼓风机环境量

配置命令为0x05 pm2.5 7 1000ppm 0 0x1e “轧钢一厂3车间1号鼓风机环境量”

如果为串口,则为

0x05 …pm2.5?0x07 …1000ppm?0x03 0x68 0x02 0x05

0x1e …轧钢一厂3车间1号鼓风机环境量?

其中68 02 05是发给传感器的询问值。如果是模拟量采集,则它为0

电池电压也是一个很重要的参数要读取的。

看一下这个周期性的任务在做什么?原来在做这个采集温度和湿度。

对于我们来说,这个没必要,只要读的时候采一下就可以了。

Char5,6,7,8,9,A都是为了读数据上去的。它们在回调函数中调用。程序中最多读20个字节上去,这个要改掉。

Char1,2,4 是读的,它的读只有一个字节。但是它在读什么,还没搞清楚。

读写

Char1 用来做写,让某个LED亮/灭的

Char2

Char3

Char4

Char5 上位机可以读它的更新时间用来更新updatetime的。会收到4个字节。Char6 上位机用来读温湿度用来做串口用的。下位机收到后打印出来。Char7 获得系统名字部分用来修改本系统名字的

Char8 用来获得高低温报警部分用来设定最高,最低报警的

Char9 用来将AD采样值发上去好象没什么用处

charA 用来读PWM值用来设置PWM的

详细看一下这个函数:

static void peripheralStateNotificationCB( gaprole_States_t newState )

这个函数是由启动事件中,设置了它,仔细看一下,它处理连接过程中的一些事宜:

case GAPROLE_STARTED: 处理GAP角色初始时的事宜,它将system_id这个值用MAC address代替。由于MAC为6位,system_id为8位,故它将中间两位清零了。

case GAPROLE_ADVERTISING:开始广播时,将这个信息打印显示一下。

case GAPROLE_CONNECTED: 已经连接时,将这个信息打印一下。

case GAPROLE_WAITING: 这个注释为正断开,有点词不达意似的。

case GAPROLE_WAITING_AFTER_TIMEOUT: 这个表示超时了,含义不清楚。

我想在连接时读AD,发串口命令(如果有的话)还是怎么读?

我们先让这个调试运行一下看一看。

结果发现这个串口没有打印,但有时候偶尔又有打印,原因未找到。本来运行就会打印,结果运行后,要等手机扫描后,再点击进到主界面时,才会有打印信息出现。

还有就是经常扫描不到设备,非得要按一个复位键才会扫描到。

再看一下keyfob这个TI的例子:

定义了,正好看一下它是如何得到电池电压的。

#define BATT_ADC_LEVEL_3V 409 应该是4096 为什么是409。

#define BATT_ADC_LEVEL_2V 273

一时没看懂。

串口现在可以打印了,因为进入了休眠模式。去掉就好了。

现在试一下,存储128个ASCII,从00到7F 然后再打印出来看一下。

我们先在启动时将它写入到NV中,然后在周期性任务中,将它打印出来看一下。发现128个字节是可以保存的,也是可以打印的,就是每次打128字节会出错。死机。

串口打印时有时出现不正常的换行。不知是什么原因?感觉也许超级终端有问题。

H 大功初成

以下我们主机用amo的主机例子程序。而从机用amo的手机采温度湿度及AD值的例子程序(没用它配套的从机程序)打算修改这两个程序,实现双向串口打印。

现在要编一个主机,一个从机,它们进行通讯,因为现在没有手机,即使有,也可能出错调试时间过长。

这样,主机先得到从机的广播看一下。将广播信息打印出来。将RSSI显示出来。

然后建立连接,通过某服务的某一个特征值,向下位机写一个hello,下位机回一个world算是通过一个基本验证了。

这样,我们还是先回到主机程序,看一下这个收到的信息是怎样的。

主程序中,有设备资信事件,设备发现事件,设备连接事件。看这个对应的是不是广播信息,扫描信息和连接信息?

根据按键来看,主机并没有收广播信息这一说法。而是直接扫描主机。而且一次最多扫描到8个主机。如果设备较多,就没有办法了。只能多次扫描。能不能只扫描感兴趣的主机?

我们先把这个主机程序再看一下,在这个基础上修改。

一切起源于按下了UP键之后,按下它就调用了:

GAPCentralRole_StartDiscovery( DEFAULT_DISCOVERY_MODE,

DEFAULT_DISCOVERY_ACTIVE_SCAN,

DEFAULT_DISCOVERY_WHITE_LIST );

这个函数一旦调用,就会引起GAP回调函数有信息回来。

就有设备资信信息过来。我们调一下看。

有事件传过来,该事件为:

typedef union

{

gapEventHdr_t gap; //!< GAP_MSG_EVENT and status. gapDeviceInitDoneEvent_t initDone; //!< GAP initialization done. gapDeviceInfoEvent_t deviceInfo; //!< Discovery device information event structure.

gapDevDiscEvent_t discCmpl; //!< Discovery complete event structure. gapEstLinkReqEvent_t linkCmpl; //!< Link complete event structure. gapLinkUpdateEvent_t linkUpdate; //!< Link update event structure. gapTerminateLinkEvent_t linkTerminate; //!< Link terminated event structure.

} gapCentralRoleEvent_t;

先看一下gapDeviceInitDoneEvent_t这部分,这中间有一个设备地址,调试中显示为00 00 ??78 13 其中的两个??是因为它不是ASCII,所以IAR系统就不显示了。

到时看一下这个中心机的地址是不是这个。

再看一个很重要的设备资料,只看到一个02 其它的我们没有看到。我们想把这个打印出来看一下。它的长度为0F。看一下

发现完成事件中有一个地址,不知是不是下位机的地址:19 02 7D 1E 7C 17?

我直接将这个gapDeviceInitDoneEvent_t打出来看一下。

结果发现,在第一次进到这个GAP_DEVICE_INFO_EVENT中,打印出来的就是广播信息。和手机上收到的是一样的。

在第2次进到这个事件中,会打印出广播信息。

我们发现这个打印老是出错,怎样让这个打印在消息中处理?即我们需要打印时,就发送一个消息给任务,在任务中在有空时才去打印这个消息中的内容,等打完后才去重新打印,即打印完了后,(这个可能要用一个函数来决定,再去打印下一个)这样就能把所有的消息都

[笔记]证据法学案例分析题

[笔记]证据法学案例分析题 (2011) 三、(本题22分) 案情:2010年10月2日午夜,A市某区公安人员在辖区内巡逻时,发现路边停靠的一辆轿车内坐着三个年轻人(朱某、尤某、何某)行迹可疑,即上前盘查。经查,在该车后备箱中发现盗窃机动车工具,遂将三人带回区公安分局进一步审查。案件侦查终结后,区检察院向区法院提起公诉。 (证据)朱某——在侦查中供称,其作案方式是3人乘坐尤某的汽车在街上寻找作案目标,确定目标后由朱某、何某下车盗窃,得手后共同分赃。作案过程由尤某策划、指挥。在法庭调查中承认起诉书指控的犯罪事实,但声称在侦查中被刑讯受伤。 尤某——在侦查中与朱某供述基本相同,但不承认作案由自己策划、指挥。在法庭调查中翻供,不承认参与盗窃机动车的犯罪,声称对朱某盗窃机动车毫不知情,并声称在侦查中被刑讯受伤。 何某——始终否认参与犯罪。声称被抓获当天从C市老家来A市玩,与原先偶然认识的朱某、尤某一起吃完晚饭后坐在车里闲聊,才被公安机关抓获。声称以前从没有与A市的朱某、尤某共同盗窃,并声称在侦查中被刑讯受伤。 公安机关——在朱某、尤某供述的十几起案件中核实认定了A市发生的3起案件,并依循线索找到被害人,取得当初报案材料和被害人陈述。调取到某一案发地录像,显示朱某、尤某盗窃汽车经过。根据朱某、尤某在侦查阶段的供述,认定何某在2010年3月19日参与一起盗窃机动车案件。 何某辩护人——称在案卷材料中看到朱某、尤某、何某受伤后包有纱布的照片,并提供4份书面材料:(1)何某父亲的书面证言:2010年3月19日前后,何某

因打架被当地公安机关告知在家等候处理,不得外出。何某未离开C市;(2)2010年4月5日,公安机关发出的行政处罚通知书;(3)C市某机关工作人员赵某的书面证言:2010年3月19日案发前后,经常与何某在一起打牌,何某随叫随到,期间未离开C市;(4)何某女友范某的书面证言:2010年3月期间,何某一直在家,偶尔与朋友打牌,未离开C市。 (法庭审判)庭审中,3名被告人均称受到侦查人员刑讯。辩护人提出,在案卷材料中看到朱某、尤某、何某受伤后包有纱布的照片,被告人供述系通过刑讯逼供取得,属于非法证据,应当予以排除,要求法庭调查。公诉人反驳,被告人受伤系因抓捕时3人有逃跑和反抗行为造成,与讯问无关,但未提供相关证据证明。法庭认为,辩护人意见没有足够根据,即开始对案件进行实体审理。 法庭调查中,根据朱某供述,认定尤某为策划、指挥者,系主犯。 审理中,何某辩护人向法庭提供了证明何某没有作案时间的4份书面材料。法庭认为,公诉方提供的有罪证据确实充分,辩护人提供的材料不足以充分证明何某在案发时没有来过A市,且材料不具有关联性,不予采纳。 最后,法院采纳在侦查中朱某、尤某的供述笔录、被害人陈述、报案材料、监控录像作为定案根据,认定尤某、朱某、何某构成盗窃罪(尤某为主犯),分别判处有期徒刑9年、5年和3年。 问题: 1(法院对于辩护人提出排除非法证据的请求的处理是否正确,为什么? 2(如法院对证据合法性有疑问,应当如何进行调查, 3(法院对尤某的犯罪事实的认定是否已经达到事实清楚、证据确实充分,为什么, 4(现有证据能否证明何某构成犯罪,为什么,

社会调查研究方法笔记整理

第二部分社会调查研究方法 要求考生了解社会调查研究的科学过程,了解具体的调查设计与实施方法,了解资料分析的方法及撰写调查报告的要求。 一、社会调查研究的主要过程与内容 社会科学领域常见的研究方式:实验研究、调查研究(社会调查)、实地研究和文献研究。社会调查概念:指的是一种采用自填式问卷或结构式访问的方法,通过直接的询问,从一个取自总体的样本那里收集系统的、量化的资料,并通过对这些资料的统计分 析来认识社会现象及其规律的社会研究方式。 社会调查基本要素:抽样、问卷、统计分析。 社会调查的特征:首先,社会调查在本质上是一种定量的研究方式。其次,社会调查是一种 横剖性的社会研究方式。 社会调查的类型:调查对象范围——普遍调查与抽样调查;收集资料方法——问卷调查(自填问卷与邮寄问卷)和访问调查(当面访问与电话访问);调查目的或作 用——描述性调查和解释性调查;调查性质和应用领域——行政统计调 查、生活状况调查、社会问题调查、市场调查、民意调查和研究性调查。 社会调查的题材:某一人群的社会背景、某一人群的社会行为和活动、某一人群的意见和态度。 普遍调查和抽样调查:抽样调查指从所研究的总体中,按照一定的方式选取一部分个体进行调查,并将在这部分个体中所得到的调查结果推广到总体中去。优点:抽 样调查非常节省时间、人力和财力;十分迅速的获得资料数据;可以比较 详细的收集信息,获得内容丰富的资料;应用范围十分广泛;准确性高。 传统社会调查和现代社会调查: 1、社会调查研究的主要过程与内容:o(╯□╰)o 2、调查研究的主要阶段 a) 确定研究课题并将其系统化(选题阶段) b) 设计研究方案和准备研究工具(准备阶段) c) 资料的收集(实施阶段) d) 资料的处理与分析(分析阶段) e) 结果的解释与报告(总结阶段) 选题阶段的任务:一是选取主题,二是形成研究问题。选择问题阶段受多种因素制约:主观:研究者理论素养、生活阅历、观察角度、研究兴趣;客观:社会环境 等。研究问题选择好坏在一定程度上决定了这个研究工作的成败。 研究设计阶段由两部分组成:道路选择(为了达到研究的目标而进行的研究设计工作,设计研究的思路、策略、方式、方法以及具体技术工具等各个方面);工具准备(对 研究所依赖的测量工具或信息收集工具如问卷、量表、实验手段等等的准备。 问卷的准备和调查对象的选取工作)。 资料收集阶段:主要任务是具体贯彻研究设计中所确定的思路和策略,按照研究设计中所确定的方式、方法和技术进行资料的收集工作。 资料分析阶段:对收集的原始资料进行系统的审核、整理、归类、统计和分析。 得出结果阶段:撰写研究报告,评价研究质量,交流研究成果。

(完整word版)行测总结笔记 学霸笔记 必过

现在开始 资料分析 之所以把资料分析放在第一,是因为本人以前最怕资料分析不难但由于位于最后,时间紧加上数字繁琐,得分率一直很低。而各大论坛上的普遍说法是资料分析分值较高,不可小觑。有一次去面试,有个行测考90分的牛人说他拿到试卷先做资料分析,我也试过,发觉效果并不好,细想来经验因人而议,私以为资料分析还是应该放在最后,只是需要保证平均5分钟一篇的时间余量,胆大心细。 一、基本概念和公式 1、同比增长速度(即同比增长率)=(本期数-去年同期数)/去年同期数x100% =本期数/去年同期数-1 显然后一种快得多 环比增长速度(即环比增长率)=(本期数-上期数)/上期数=本期数/上期数-1 2、百分数、百分比(略) 3、比重(略) 4、倍数和翻番 翻番是指数量的加倍,翻番的数量以2^n次变化 5、平均数(略) 6、年均增长率 如果第一年的数据为A,第n+1年为B 二、下面重点讲一下资料分析速算技巧 1、a=b÷(1+x%)≈b×(1-x%)结果会比正确答案略小,记住是略小,如果看到有个选项比 你用这种方法算出来的结果略大,那么就可以选;比它小的结果不管多接近一律排除; x越小越精确 a=b÷(1-x%)≈bX(1+x%)结果会比正确答案略小,x越小越精确 特别注意: ⑴当选项差距比较大时,推荐使用该方法,当差距比较小时,需验证 ⑵增长率或者负增长率大于10%,不适用此方法 2、分子分母比较法 ⑴分子大分母小的分数大于分子小分母大的分数 ⑵差分法★ 若其中一个分数的分子和分母都大于另外一个分数的分子和分母,且大一点点时,差分法非常适用。 例:2008年产猪6584头,2009年产猪8613头,2010年产猪10624头,问2009与2010哪一年的增长率高 答:2009增长率8613/6584-1 ,2010增长率10624/8613-1,-1不用看,利用差分法

案例部分复习笔记-完整版(要求背诵)

鉴于案例部分是较难攻克的一门课,所以本人在案例这门课上花费了大量时间。附件部分是我自己根据王老师(王起全)老师的音频,逐步逐步总结出来的,希望对大家有用。和大家分享成果就是一种成功的过程。祝愿大家都能一次性通过考试,为我国的安全事业添砖加瓦。 案例部分复习笔记: 安全标准化建设的流程: 五个基本保障(重点内容): 1确定目标2组织机构保障3安全生产投入保障4法律法规的执行和规章制度的建设5 教育培训 五个重要保障: 1 生产设备设施的安全 2 作业安全 3 隐患排查和治理 4 重大危险源监控 5 职业健康 三个事后监督 1.应急救援 2. 事故管理3 绩效评定和持续改进 安全文化建立的操作步骤: 1.安全文化建设委员会—Tim等 2.制定规划——道康宁全场的安全 3.培训骨干——成品工厂和JV工厂的个区域负责人 4.宣传教育——通过入场培训和DCU培训 5.努力实践——实践 重大危险源的计算:q1/Q1+q1/Q2+…+qn/Qn≥1,q1:代表危险源的实际存在量(吨),Q1:代表各种危险源的临界量。 安全规章制度建立的依据是: 1.按照法律法规和国家和行业规范 2.核心是有害因素辨识和控制 3.以国际国内先进的安全管理方式为依据 安全规章制度建立的八大流程: 主要负责人授权安全部门起草安全规章制度(3-5年全面修订一次): 1.起草——授权安全部门 2.会签或公开征求意见 3.审核 4.签发 5.发布-通过红头文件 6.培训 7.反馈

1.措施应用的单位或工作场所 2.措施名称 3.措施目的和内容 4.经费预算和来源 5.实施部门的负责人 6.开工日期和竣工日期 7.预期效果和检查验收 安全措施计划的编制方法(五同时): 1.确定措施计划的编制时间——计划 2.布置措施计划编制工作——布置(确定内容) 3.确定措施计划项目和内容——编制(安全部门负责制定) 4.编制措施计划——审批(总工) 5.下达安全措施计划(实施) 三同时的流程: 可行性研究报告——安全预评价(建设单位委托评价机构根据可行性报告在可行性研究报告阶段设计前)——1. 送安监局备案2. 建设单位给设计单位===根据安全预评价出设计安全专篇和图纸和方案——施工单位——严格施工(施工单位对施工质量和安全全权负责)——施工结束——验收评价(试生产后正式投产前)-验收报告——1. 企业留底 2. 送安监(竣工验收意见书)——合格和不合格 案例考生写安全条件论证报告: 1.危险源辨识 2.对周边设施和居民的影响 3.周边的设施和居民对本项目的影响 4.自然灾害的影响 编制安全检查表(考试重点) 序号内容结果依据备注 1特种作业人员持 合格1 特种作业培训考核规定 2 安全生产法 2汽油车间防雷接 不合格防雷接地标准 3 4 5 重大事故隐患报告: 1.隐患产生的原因和产生原因 2.危害程度和整改难易度分析 3.隐患治理方案— 1)治理的目标和任务2)治理的方法和措施3)经费和物资的落实4)、负责治理的机构和人员5)治理的时限和要求6)安全措施和应急预案 安全评价:危险和有害因素识别危险度评价安全措施对策和建议

资料分析报告笔记整理好

资料分析笔记整理 一.资料分析基础概念与解题技巧 1.资料分析核心运算公式 2.资料分析常用基本概念 3.资料分析速算技巧 二.资料分析高频高点梳理 1.ABR类问题 2.比重类问题 资料分析基础概念与解题技巧 一、基期、本期 基期,表示的是在比较两个时期的变化时,用来做比较值(基准值)的时期,该时期的数值通常作为计算过程中的除数或者减数; 本期,相对于基期而言,是当前所处的时期,该时期的数值通常作为计算过程中的被除数或者被减数。 【注】和谁相比,谁做基期。 二、增长量、增长率(增长速度、增长幅度) 增长量,表示的是本期与基期之间的绝对差异,是一绝对值。 增长率,表示的是末期与基期之间的相对差异,是一相对值。 增长率=增长速度(增速)=增长幅度(增幅) 【注】在一些“最值”比较题的题干表述中,经常出现“增加(长)最多”和“增加(长)最快”,我们需要注意,前者比较的是增长量,而后者则比较的是增长率。 三、同比、环比 同比和环比均表示的是两个时期的变化情况,但是这两个概念比较的基期不同。同比,指的是本期发展水平与历史同期的发展水平的变化情况,其基期对应的是历史同期。 环比,指的是本期发展水平与上个统计周期的发展水平的变化情况,其基期对应的是上个统计周期。 【注】环比常出现在月份、季度相关问题。 四、公式运用与练习 资料分析的考察离不开对于两个时期的数值的比较,由此得出四个概念,

即基期(A),本期(B),增长率(R),增长量(X)。 增长量=基期量*增长率=本期量-基期量=本期量-本期量/1+增长率 增长率=增长量/基期量=(本期量-基期量)/基期量=本期量/基期量-1 本期=基期+增长量=基期+基期*增长率=基期*(1+增长率) 基期=本期-增长量=本期/1+增长率 【习题演练】 【例一】2012年1-3月,全国进出口总值为8593.7亿美元,同比增长7.3%,其中:出口4300.2亿美元,增长7.6%;进口4293.6亿美元,增长6.9%。3月当月,全国进出口总值为3259.7亿美元,同比增加216亿美元,其中:出口1656.6亿美元,增长135.4亿美元;进口1603.1亿美元,增长5.3%。 1、2011年一季度,全国进出口总值约为多少? 2、2012年一季度,全国出口额同比增长多少? 3、2011年三月份,全国进出口总值约为多少? 4、2012年三月份,全国出口总值同比增速约为多少? 【注】进出口相关问题,为资料分析中的一个易错点,注意题目中进出口、进口、出口的表述,注意进出口量与进出口额的不同,理解顺差、逆差的含义 出口-进口=顺差,反之则是逆差 2、资料分析常用基本概念 一、百分数、百分点 百分数,表示的是将相比较的基期的数值抽象为100,然后计算出来的数值,用“%”表示,一般通过数值相除得到,在资料分析题目常用在以下情况:(1)部分在整体中所占的比重;(2)表示某个指标的增长率或者减少率。 百分点,表示的是增长率、比例等以百分数表示的指标的变化情况,一般通过百分数相减得到,在资料分析题目常用在以下情况:(1)两个增长率、比例等以百分数表示的数值的差值;(2)在A拉动B增长几个百分点,这样的表述中。【例1】2010年,某省地区生产总值达到6835.7亿元,比去年同期增长14.9%。其中,第一产业增加值为483.5亿元,比去年同期增长25.8%,第二产业增加值为2985.6亿元,同比增长12.5%。 1、2010年,该省第一产业增加值占地区生产总值的比重为()。A.12.63% B.12.63个百分点 C.7.07% D.7.07个百分点 2、2010年,该省第一产业增加值同比增速比第二产业增加值增速高()。A.13.3% B.13.3个百分点 C.14.3% D.14.3个百分点 二、倍数、翻番 倍数,指将对比的基数抽象为1,从而计算出的数值。 翻番,指数量的加倍,如:如果某指标是原来的2倍,则意味着翻了一番,是原来的4倍,则意味着翻了两番,依此类推。所用的公式为:末期/基期=2n,即翻了n番。 【注】注意“超过N倍”“是xx的N倍”两种说法的区别。超过N倍,说明是基数的N+1倍。

案例分析学习笔记教学内容

2018年注安案例分析学习笔记 一、根据导致事故的原因、致伤物和伤害方式等,将危险因素分为20类:物体打击、车辆伤害、机械伤害、触电、火灾、灼烫、起重伤害、高处坠落、其他伤害;坍塌、中毒和窒息、锅炉爆炸、容器爆炸、其他爆炸;淹溺、瓦斯爆炸、火药爆炸、冒顶片帮、透水、放炮。 二、事故分类:1、死亡判定(3-10-30).2、重伤判定(10-50-100)。3、直接经济损失(1000-5000-1个亿)。4、死亡时间追加为30天,交通、火灾7日。 三、事故报告的内容:1、事故发生单位概况.2、事故的简要经过.3、事故发生的时间、地点以及事故现场情况.4、事故已经造成或者可能造成的伤亡人数(包括下落不明的人数)和初步估计的直接经济损失.5、已经采取的措施.6、其他应当报告的情况。 四、事故调查的程序:1、成立事故调查。2、事故现场抢救处理。3、事故有关物证的搜集。4、事故事实材料搜集。5、事故认证材料的收集.6、事故现场摄影、录像;7、事故现场图的绘制。8、事故原因分析.9、编写事故调查处理报告。10、事故调查处理结案归档。 五、事故调查组的职责:1、查明事故发生的原因,人员伤亡及财产损失情况;2、认定事故的性质和责任;3、提出对事故责任的处理建议;4、总结事故教训,提出防范和整改措施;5、提交事故调查报告。 六、事故分析原因:人、物、管理缺陷、生产环境。分析步聚: 1、有令不行、有禁不止、不落实整改措施、不重视安全工作,忽视安全管理. 2、违章指挥、违规作业. 3、人员未经专业培训或教育培训不够. 4、作业现场混乱或劳动组织不合理. 5、有关部门未督促企业落实整改措施. 6、技术和设计上有缺陷。 7、安全操作规程不健全。

公务员考试行测资料分析状元笔记

2017年公务员考试行测资料分析状元笔记通用阅读——上看标题,下看注释,中间看时间,单位(重点) 1文字性材料——难的是阅读(结构阅读是重点) 文字性材料阅读结构和中心 结构几段落——总分和并列—并列部分找中心词(圈点标点,括号标结构,圈标中心词)无结构小段,就仔细阅读,创造结构(圈点标点,标点暗示结构,括号标结构,圈标中心词)无结构大段,就直接读题—找两个关键词——区分性(平均气温),明显性(符号数字字母,例如括号,摄氏度,顿号之类的)——2007年底比2007年更合适 多个题目涉及同一个关键词的,可以一起做 2表格型材料——难的是计算 阅读横标目和纵标目 分清合计和项目和地区 3图形型材料——难的是理解 饼状图——看周围类别名称(包括大小的排名要心中有印象) 柱状趋势图——看横轴和纵轴(要注意两个纵轴的分别对应柱状和点) 柱状分两种:一种是绝对值(高低差异),一种是比例(高低相同,柱状分几个部分) 4统计术语(不是重点) 增长率是属于后一年(所以第一年的增长率是算不出来的) 前一年的总量=后一年除以(1+增长率)后一年除以(1-增长率) 增长率的对比(很容易会出隔两年的总量,倒推2次):增长率增长或降低了5个百分点(直接加减) 乘以2看成除以5 乘以5看成除以2 乘以25看成除以4 除以125看成乘以8 同比是与上一年的同一期相比较 环比是挨着的相同时间段相比较 同比和环比:如果有注释按注释为准 今年5月份环比=今年4月份 今年5月份同比=去年5月份 5统计性数据的要素——时间和单位(重点) 1时间表述(陷阱)——对时间很敏感 1.计算的年份不一样 2.计算的时间段不一样 2单位表述(陷阱)——对单位很敏感 1.饼状图有单位,就不是百分比 相比较的数据的单位不一样(注意是百分号还是千分号。年利率往往用百分,月利率用千分之) 2.计算的单位不一样 下列选项一定正确和一定错误的题目是最难的,可以放在最后做。

项目决策与分析学习笔记(第一章)

第一章概论 第一节项目决策与决策分析评价 一、项目目标 项目目标一般分为项目的宏观目标和具体目标两个层次。 (一)项目的宏观目标是指项目建设对国家、地区、部门或行业要达到的整体发展目标所产生的积极影响和作用。不同性质项目的宏观目标不同。 (二)项目的具体目标 项目的具体目标是指新项目建设要达到的直接效果。4个! 1.效益目标。 效益目标指项目经济效益、社会效益、环境效益等方面要实现的目标值。 (1)经营性项目,效益目标主要是对投资收益确定具体的目标值。 (2)公共基础设施项目,效益目标主要是指满足客观需要的程度或提供服务的范围。 (3)环境治理项目,其效益目标主要是指环境治理的效果。 2.规模目标。建设规模确定的目标值。 3.功能目标。企业根据自身的总体发展战略、主要经营方向、国家产业政策和技术政策的要求、以及国家总体规划、资源政策和环境政策的要求研究确定建设项目的功能目标。 4.市场目标。目标市场、市场份额等。 (三)项目目标与宏观规划发展目标的一致性 项目目标要与国家、地区、部门、行业的宏观规划发展目标相一致;要符合区域发展规划、行业发展规划、城市规划的要求;要符合国家产业政策和技术政策的要求;要符合合理配置、有效利用资源、保护环境、可持续发展和建设和谐社会的要求。 二、项目决策 (一)决策是指人们为了实现特定的目标,在掌握大量有关信息的基础上,运用科学的理论和方法,系统地分析主客观条件,提出若干预选方案,分析各方案的优缺点,从中选择出最适当的行动方案。 1.决策过程:信息收集、方案设计、方案评价、方案抉择四个相互联系、相互交织、往复循环的阶段。 2.决策的分类 (1)根据决策对象的性质,分为投资决策、融资决策、营销决策等; (2)根据决策目标的数量,分为单目标决策和多目标决策; (3)根据决策问题面临条件,分为确定型决策、不确定型决策、风险型决策。 (二)投资项目决策,从不同决策者的角度可将项目决策分为: (1)企业投资项目决策。(2)政府投资项目决策。(3)金融机构贷款决策。 (三)投资项目决策的内涵和作用 投资项目决策的内涵是按照一定的项目目标,根据投资方向、投资布局的战略构想,充分考虑国家有关的方针、政策,在广泛占有信息资料的基础上,对拟建项目进行技术经济分析和多种角度的综合分析评价,决定项目是否建设,在什么地方和什么时间建设,选择并确定项目建设的较优方案。 投资项目决策的作用:项目建设具有不可逆转性,投资形成的实物工程难以改变,一旦决策有误,有可能导致工程废弃、造成损失,甚至项目的失败。 (四)项目决策应遵循的原则(五原则) 1.科学决策原则

案例分析学习笔记

2018 年注安案例分析学习笔记 一、根据导致事故的原因、致伤物和伤害方式等,将危险因素分为20 类:物体打击、车辆伤害、机械伤害、触电、火灾、灼烫、起重伤害、高处坠落、其他伤害;坍塌、中毒和窒息、锅炉爆炸、容器爆炸、其他爆炸;淹溺、瓦斯爆炸、火药爆炸、冒顶片帮、透水、放炮。 二、事故分类:1、死亡判定( 3-10-30 ).2 、重伤判定( 10-50-100 )。 3、直接经济损失( 1000-5000-1 个亿)。 4、死亡时间追加为30 天,交通、火灾7 日 三、事故报告的内容:1、事故发生单位概况.2 、事故的简要经过.3 、事故发生的时间、地点以及事故现场情况.4 、事故已经造成或者可能造成的 伤亡人数 (包括下落不明的人数)和初步估计的直接经济损失.5 、已经采取 的措施.6 、其他应当报告的情况。 四、事故调查的程序:1、成立事故调查。2、事故现场抢救处理。3、事故有关物证的搜集。4、事故事实材料搜集。5、事故认证材料的收集.6 、事故现场摄影、录像;7、事故现场图的绘制。8、事故原因分析.9 、编写事故调查处理报告。10、事故调查处理结案归档。 五、事故调查组的职责:1、查明事故发生的原因,人员伤亡及财产损失情况; 2、认定事故的性质和责任; 3、提出对事故责任的处理建议; 4、总结事故 教训,提出防范和整改措施;5、提交事故调查报告。 六、事故分析原因:人、物、管理缺陷、生产环境。分析步聚: 1、有令不行、有禁不止、不落实整改措施、不重视安全工作,忽视安全管理. 2、违章指挥、违规作业.3 、人员未经专业培训或教育培训不够.4 、作业现场混乱或劳动组织不合理.5 、有关部门未督促企业落实整改措施.

资料分析笔记整理样本

资料分析笔记整顿 一.资料分析基本概念与解题技巧 1.资料分析核心运算公式 2.资料分析惯用基本概念 3.资料分析速算技巧 二.资料分析高频高点梳理 1.ABR类问题 2.比重类问题 资料分析基本概念与解题技巧 一、基期、本期 基期,表达是在比较两个时期变化时,用来做比较值(基准值)时期,该时期数值普通作为计算过程中除数或者减数; 本期,相对于基期而言,是当前所处时期,该时期数值普通作为计算过程中被除数或者被减数。 【注】和谁相比,谁做基期。 二、增长量、增长率(增长速度、增长幅度) 增长量,表达是本期与基期之间绝对差别,是一绝对值。 增长率,表达是末期与基期之间相对差别,是一相对值。 增长率=增长速度(增速)=增长幅度(增幅) 【注】在某些“最值”比较题题干表述中,经常浮现“增长(长)最多”和“增长(长)最快”,咱们需要注意,前者比较是增长量,而后者则比较是增长率。 三、同比、环比 同比和环比均表达是两个时期变化状况,但是这两个概念比较基期不同。 同比,指是本期发展水平与历史同期发展水平变化状况,其基期相应是历史同期。

环比,指是本期发展水平与上个记录周期发展水平变化状况,其基期相应是上个记录周期。 【注】环比常出当前月份、季度有关问题。 四、公式运用与练习 资料分析考察离不开对于两个时期数值比较,由此得出四个概念, 即基期(A),本期(B),增长率(R),增长量(X)。 增长量=基期量*增长率=本期量-基期量=本期量-本期量/1+增长率 增长率=增长量/基期量=(本期量-基期量)/基期量=本期量/基期量-1 本期=基期+增长量=基期+基期*增长率=基期*(1+增长率) 基期=本期-增长量=本期/1+增长率 【习题演习】 【例一】1-3月,全国进出口总值为8593.7亿美元,同比增长7.3%,其中:出口4300.2亿美元,增长7.6%;进口4293.6亿美元,增长6.9%。3月当月,全国进出口总值为3259.7亿美元,同比增长216亿美元,其中:出口1656.6亿美元,增长135.4亿美元;进口1603.1亿美元,增长5.3%。 1、一季度,全国进出口总值约为多少? 2、一季度,全国出口额同比增长多少? 3、三月份,全国进出口总值约为多少? 4、三月份,全国出口总值同比增速约为多少? 【注】进出口有关问题,为资料分析中一种易错点,注意题目中进出口、进口、出口表述,注意进出口量与进出口额不同,理解顺差、逆差含义 出口-进口=顺差,反之则是逆差 2、资料分析惯用基本概念 一、百分数、百分点 百分数,表达是将相比较基期数值抽象为100,然后计算出来数值,用“%”表

粉笔资料分析听课笔记(整理版)

粉笔资料分析听课笔记(整理版)一、常用分数、百分数、平方 1 3=33.3% 1 4=25% 1 5=20% 1 6=16.7% 1 7=14.3% 1 8=12.5% 1 9=11.1% 1 10=10% 1 11=9.1% 1 12=8.3% 1 13=7.7% 1 14=7.1% 1 15=6.7% 1 16=6.3% 1 1.5=66.7% 1 2.25=44% 1 2.5=40% 1 3.5=28.6% 1 4.5=22% 1 5.5=18.2% 1 6.5=15.4% 1 7.5=13.3% 1 8.5=11.8% 1 9.5=10.5% 1 10.5=9.5% 1 11.5=8.7% 1 12.5=7.8% 1 13.5=7.4% 1 14.5=6.9% 1 15.5=6.5% 1 16.5=6.1% 22=2 32=942=1652=2562=3672=4982=64 92=81 102=100112= 121122=144132=169 142=196152=225 162=256 172=289182=324192=361202=400212=441 222=484232=529 242=576252 =625 262=676272=729 282=784292=841 二、截位直除速算法 三、其他速算技巧 1、一个数×1.5,等于这个数本身加上这个数的一半。 2、一个数×1.1等于这个数错位相加. 3、一个数×0.9等于这个数错位相减. 4、一个数÷5,等于这个数乘以2,乘积小数点向前移1位。

5、一个数÷25,等于这个数乘以4,乘积小数点向前移2位。 6、一个数÷125,等于这个数乘以8,乘积小数点向前移3位。 7、比较类:①分母相同,分子大的大;分子相同,分母小的大。 ②分子大分母小>分子小分母大。③当分母大分子大,分母小分子小时,看分母与分母的倍数,分子与分子的倍数,谁倍数大听谁的,谁小统统看为1,再比较。 四、统计术语 1、基期:相对于今年来说,去年的就是基期。 2、现期:相对于去年来说,今年的就是现期。 3、基期量:相对于今年来说,去年的量就是基期量。 4、现期量:相对于去年来说,今年的量就是基期量。 5、增长量:现期量和基期量的差值,就是增长量。 6、增长率:增长量与基期量的比值,就是增长率。 7、倍数:A 是B 的多少倍;A 为B 的多少倍,等于增长率加1。 辨析:A 比B 增长了500%,那么就是A 比B 增长(多)5倍,A 是B 的6倍。 8、比重:A 占B 的比重,A 占B 为多少;都等于 A B 。 A 占B 的比重比C 的比重为:A B - C B 。 9、平均数:在一组数据中所有数据之和再除以数据的个数。 10、同比:同比看年,今年与去年同期比。 11、环比:环比看尾,“年”“月”“日”等。

广告创意与案例分析笔记

第一章广告创意概述 第一节广告创意的概念及本质 主要内容:①创意是什么②广告创意的实质 一、什么是创意? Creation 最广泛认同的中文创意来源 Idea 美国创意大师詹姆斯·韦伯·扬广告名著中的被广泛采纳 1、广义上的创意可以定义为一切具有创造性的意念和想法。 在中国传统美学中,“意”是一种使人感受、领舞、玩味无穷却难以言却。 2、创意最大的特点是“新”,即新颖、新奇、新鲜。因为创新性、是创意区别于一般的意念 和想法之处。 二、广告创意的定义: 1、教材:(最精辟的定义)旧的元素,新的组合。------詹姆斯·韦伯·扬 广告创意是综合运用各种天赋能力和专业技术,由现有素材中求得新概念,新表现,新手法的过程。 案例:成长难免有创伤-----邦迪 2、广告策划与广告创意: 广告策划和广告创意都属于广告活动的要素之一,而广告创意属于广告表现的核心要素之一。 广告策划解决的是广告活动的方向对与错的问题,广告创意解决的是目标受众对广告产品喜欢。 案例:没有愈合不了的伤口-----邦迪 3、广告创意定义:(必须要记)

广告创意是广告创意人员根据商品(品牌)的整体传播策略,对抽象的商品(品牌)的诉求概念加以提炼,成为物质层面的功能特征或精神层面的价值观念,并将之转换为具象的视觉符号以求达成理想的传播效果的创造性的形象思维活动。 4、如何理解广告创意的定义? (1)广告创意是创造性的思维活动 (2)广告创意的前提是科学地调查和分析 (3)广告创意就是要善于将抽象的诉求概念转换为具象的、艺术性的表现形式 现代广告策划和设计的实质就是创意,创意是广告的灵魂。 5、走出广告创意的误区: (1)广告创意不仅是表现手段,也是策略。(例:麦当劳,我就喜欢:我就喜欢动刀子系列) (2)广告创意重在影响而不是说服。[影响是说服前提,说服是影响的最终归宿](例:CANAL+“衣橱篇”——绝不要低估好故事的力量) (3)广告创意中少有绝对的新与旧,多是旧元素的新组合。(例:Rose内衣广告) 6、广告创意的实质: 创意的实质就是具有颠覆性的,值得拥有的好点子。(例:百事可乐贩卖机,柜员机。) 第二节广告创意的任务 一、广告创意的作用 1.有助于广告活动达成预期目标。 [绝对伏特加创意广告(TBWA 李岱艾日本)①心电图②酒杯弯曲] 2.有助于广告进行告知活动。[中兴百货]

数学分析学习方法与心得体会

数学分析学习方法 数学分析是基础课、基础课学不好,不可能学好其他专业课。工欲善其事,必先利其器。这门课就是器。学好它对计算科学专业的学生都是极为重要的。这里,就学好这门课的学习方法提一点建议供同学们参考。 1.提高学习数学的兴趣 首先要有学习数学的兴趣。两千多年前的孔子就说过:“知之者不如好之者,好之者不如乐之者。”这里的“好”与“乐”就是愿意学、喜欢学,就是学习兴趣,世界知名的伟大科学家、相对论学说的创立者爱因斯坦也说过:“在学校里和生活中,工作的最重要动机是工作中的乐趣。”学习的乐趣是学习的主动性和积极性,我们经常看到一些同学,为了弄清一个数学概念长时间埋头阅读和思考;为了解答一道数学习题而废寝忘食。这首先是因为他们对数学学习和研究感兴趣,很难想象,对数学毫无兴趣,见了数学题就头痛的人能够学好数学,要培养学习数学的兴趣首先要认识学习数学的重要性,数学被称为科学的皇后,它是学习科学知识和应用科学知识必须的工具。可以说,没有数学,也就不可能学好其他学科;其次必须有钻研的精神,有非学好不可的韧劲,在深入钻研的过程中,就可以领略到数学的奥妙,体会到学习数学获取成功的喜悦。长久下去,自然会对数学产生浓厚的兴趣,并激发出学好数学的高度自觉性和积极性。用兴趣推动学习,而不是用任务观点强迫自己被动地学习数学。 2.知难而进,迂回式学习 首先要培养学习数学分析的兴趣和积极性,还要不怕挫折,有勇气面对遇到的困难,有毅力坚持继续学习,这一点在刚开始进入大学学习数学分析时尤为重要。 中学数学和大学数学,由于理论体系的截然不同,使得同学们会在学习该课程开始阶段遇到不小的麻烦,这时就一定得坚持住,能够知难而进,继续跟随老师学习。

自考合同法重点难点案例分析笔记[1][1]

合同法笔记 第一章合同与合同法 1.简述合同的概念及其法律特征。 我国《合同法》第2条规定:“合同是平等主体的自然人、法人及其他组织之间设立、变更、终止民事权利、义务关系的协议。”合同具有以下特征: (1)合同是一种合意,合同的本质在于,它是一种合意。因此,合同必须包含以下要素:一是合同的成立必须有两个以上的当事人;二是各方当事人需互相作出意思表示;三是各个意思表示是一致的。 (2)合同是发生法律上效果的双方民事行为,合同不是事实行为,而是一种民事行为,是能够引起法律效果的双方民事行为。 (3)合同是发生民法上效果的民事行为。所谓民法上的效力,是指合同能够产生设立、变更或者终止民事权利义务关系的效力。 2.区分单务合同和双务合同的意义。所谓双务合同, 是指当事人双方互负对待给付义务的合同,即一方当事人愿意负担履行义务,旨在使他方当事人因此负有对待给付的义务。双务合同是典型的交易形式,因为当事人间的对待给付具有交换性(如买卖、互易、租赁合同); 所谓单务合同是指合同当事人仅有一方负担给付义务的合同(如借用合同)。 在法律上区分单务合同和双务合同的意义有以下几点: 第一,是否适用同时履行抗辩权方面不同:单务合同不适用同时履行抗辩权;而在双务合同中,若当事人同时履行义务的,适用同时履行抗辩权。 第二,在风险的负担上是不同的:在双务合同中,如果非因一方当事人的原因(如不可抗力的发生)导致其不能履行合同义务,其合同债务应被免除,其享有的合同权利也应归于消灭。一方已经履行的,应将其所得返还对方。在单务合同中,如果一方因不可抗力而导致不能履行义务,不会发生双务合同中的风险负担问题 第三,因一方的过错所致合同不履行的后果不同。在双务合同中,如果非违约方已履行合同的,可以要求违约方履行合同或承担其他违约责任。如果非违约方要求解除合同,则对于其已经履行的部分有权要求未履行义务的一方返还其已取得的财产。在单务合同中,因主要由一方承担义务,如果他已经履行了部分义务,同时违反了合同义务,则无权要求对方对待履行或者返还财产。 3.区分有偿合同与无偿合同的意义。 根据当事人是否可以从合同中获取某种利益,可以将合同分为有偿合同与无偿合同。 有偿合同是指一方通过履行合同规定的义务而给对方某种利益,对方要得到该利益必须为此支付相应代价的合同,有偿合同是商品交换最典型的法律形式; 无偿合同是指一方给付对方某种利益,对方取得该利益时并不支付任何报酬的合同。

安全生产事故案例分析总结

安全生产事故案例分析考点笔记 一、 危险源的题型(4种考法): 1. 根据GB6441-1986<企业职工伤亡事故分类标准 2. 根据GB6441-1986<企业职工伤亡事故分类标准 3. 根据GB6441-1986<企业职工伤亡事故分类标准 4. 职业病危害因素:噪声、振动、粉尘、高温、低温、 气压气流、辐射(单考职业病需要加 上中毒,辐射分为电离辐射和非电离辐射)。 二、 《生产过程危险和有害因素分类与代码》 GB/T13861-2009 1、 人的因素一一行为因素:两个错误(违章操作、违章指挥)、一个失误(指挥失误) 2、 物的因素一一物理因素:设备设施工具附件缺陷、防护缺陷、电伤害、噪声、振动伤害、 明火、电离辐 射、非电离辐射、运动物伤害、高温物体、低温物体、信号缺陷、标志缺陷、 有害光照、其他物理性危害和有害因素(设、防、电、噪、振;明、辐、运、高、低;信、 标、有、其他)。化学因素危险和有害因素:燃、爆、毒。生物性危险和有害因素。 3、 环境因素:室内作业场所环境不良 ;室外作业场所环境不良;地下作业环境不良。 4、 管理因素:管理上的失误、缺陷和管理责任所导致的危险和有害因素。 三、 《企业职工伤亡事故分类标准》 GB6441-1986 事故类型(危险因素):20类 1个打击:物体打击; 4个伤害:车辆伤害、机械伤害、起重伤害、其他伤害; 4个常见:触电、火灾、高处坠落、坍塌; 4个煤矿:冒顶片帮、透水、放炮、瓦斯爆炸; 4个爆炸:锅炉爆炸、火药爆炸、容器爆炸、其他爆炸; 1个中毒和窒息; 2个不常见:灼烫、淹溺。 四、 安全措施 (一)安全技术对策 1、 机械安全对策:① 使用本质安全的机械设备(用自动化,半自动化代替手工);② 使 用联锁性的安全防护装置;③ 安全标识:④ 个体防护:衣服束紧,帽子要带好,女工的头 发要盘起来… 2、 电气安全对策:①IT , TT , TN 系统(TN-S 最好)② 设备绝缘;③ 电气隔离;④ 安全 电压 42V 、36V 、24V 、12V 、6V :⑤ 易燃易爆,防爆电气设备;⑥ 漏电保护(手持电动 工具);⑦ 个体防护:绝缘 鞋,绝缘手套 3、 特种设备安全对策: 技术措施:①一体化控制② 检测,检验 管理措施:① 登记(市级);② 建立技 术档案;③ 建立规章制度和操作规程;④ 急预案;⑤持证上岗 4、 防火防爆安全对策: 防火:①防火设计符合要求;② 装饰使用阻燃,难 燃,不燃的材料;③ 吸烟,雷电,静电,摩擦,撞击,电击火花;④ 气体,液体:设备密闭,厂房通风,加强检测;⑤ 灭火器,喷淋; ⑥ 消防通道要畅通,防火门不能上锁; 捂住口鼻等 防爆:① 防爆设计符合要求;② 防爆电气设备;③ >写出危险因素(20类); >写出事故类型(20类); >写出危险有害因素(27类,20+7); 专项应 控制火源:明火, 控制可燃物,固体:分类摆放,分类储存; 现场要配备足够的消防器材:消火栓, ⑦ 火灾发生后,匍匐前进,湿毛巾 防爆工具的使用;④控制爆炸极限范

复杂网络分析库NetworkX学习笔记(1):入门

复杂网络分析库NetworkX学习笔记(1):入门 本文转载至:https://www.sodocs.net/doc/2117266756.html,/blog-404069-337442.html NetworkX是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。我已经用了它一段时间了,感觉还不错(除了速度有点慢),下面介绍我的一些使用经验,与大家分享。 一、NetworkX及Python开发环境的安装 首先到https://www.sodocs.net/doc/2117266756.html,/pypi/networkx/下载networkx-1.1-py2.6.egg,到https://www.sodocs.net/doc/2117266756.html,/projects/pywin32/下载pywin32-214.win32-py2.6.exe。如果要用Networkx的制图功能,还要去下载matplotlib和numpy,地址分别在https://www.sodocs.net/doc/2117266756.html,/projects/matplotlib/和https://www.sodocs.net/doc/2117266756.html,/projects/numpy/files/。注意都要用Python 2.6版本的。 上边四个包中,pywin32、matplotlib和numpy是exe文件,按提示一路next,比较容易安装。而NetworkX是个egg文件,安装稍微麻烦,需要用easyinstall安装。具体方法:启动DOS控制台(在“运行”里输入cmd),输入C:\Python26\Lib\site-packages\easy_install.py C:\networkx-1.1-py2.6.egg,回车后会自动执行安装。注意我是把

粉笔资料分析听课笔记(整理版)

粉笔资料分析听课笔记(整理版) 一、常用分数、百分数、平方 13 =33.3% 14 =25% 15 =20% 16 =16.7% 17 =14.3% 1 8 =12.5% 19 =11.1% 110 =10% 111 =9.1% 112 =8.3% 113 =7.7% 1 14 =7.1% 115 =6.7% 1 16 =6.3% 11.5 =66.7% 12.25 =44% 12.5 =40% 13.5 =28.6% 14.5 =22% 15.5 =18.2% 16.5 =15.4% 17.5 =13.3% 18.5 =11.8% 19.5 =10.5% 110.5 =9.5% 111.5 =8.7% 112.5 =7.8% 113.5 =7.4% 114.5 =6.9% 115.5 =6.5% 116.5 =6.1% 22=2 32=9 42=16 52=25 62=36 72=49 82=64 92=81 102=100 112= 121 122=144 132=169 142=196 152=225 162=256 172=289 182=324 192=361 202=400 212=441 222=484 232=529 242=576 252 =625 262=676 272=729 282=784 292=841 二、截位直除速算法

三、其他速算技巧 1、一个数×1.5,等于这个数本身加上这个数的一半。 2、一个数×1.1等于这个数错位相加. 3、一个数×0.9等于这个数错位相减. 4、一个数÷5,等于这个数乘以2,乘积小数点向前移1位。 5、一个数÷25,等于这个数乘以4,乘积小数点向前移2位。 6、一个数÷125,等于这个数乘以8,乘积小数点向前移3位。 7、比较类:①分母相同,分子大的大;分子相同,分母小的大。 ②分子大分母小>分子小分母大。③当分母大分子大,分母小分子小时,看分母与分母的倍数,分子与分子的倍数,谁倍数大听谁的,谁小统统看为1,再比较。 四、统计术语 1、基期:相对于今年来说,去年的就是基期。 2、现期:相对于去年来说,今年的就是现期。 3、基期量:相对于今年来说,去年的量就是基期量。 4、现期量:相对于去年来说,今年的量就是基期量。 5、增长量:现期量和基期量的差值,就是增长量。 6、增长率:增长量与基期量的比值,就是增长率。 7、倍数:A是B的多少倍;A为B的多少倍,等于增长率加1。 辨析:A比B增长了500%,那么就是A比B增长(多)5倍,A是B的6倍。

泛函分析读书笔记

《泛函分析》读书笔记 Reading Notes about Functional Analysis 崔继峰 所谓的泛函呢,就是一般函数,泛函分析当然就是一般函数的分析研究。在学习泛函之前,需要有扎实的《实变函数》知识。大学期间,曾用半年时间学过由南开大学刘炳初教授编著,科学出版社出版的《泛函分析》,讲课的是哈尔滨工业大学的包革军教授,他讲泛函的最大特点是把泛函与几何图形有机结合,把艰深的纯理论讲的惟妙惟肖。在进入研究生学习阶段,《泛函分析》作为计算数学研究生的基础理论课程,是必选的。我们选用的教材是由武汉大学刘培德教授主编,武汉大学出版社出版的《泛函分析(第二版)》,该教材是面向本科生的,系里之所以考虑选择此教材,是由于考虑到有些学生在本科阶段没有或者很粗浅的认识了《泛函分析》这门课程,主讲该课程的是高云兰博士,她的方向就是算子方面的研究,所以讲解该课程那是轻车熟路了。课时大约是48学时(粗略估计)。由于以下两方面的原因:1)对于《泛函分析》认识很粗浅;2)第一次写读书笔记(尤其是专业课类),不知道如何从略。所以读书笔记可能从在诸多问题,希望老师见谅!下面我从几个方面写本学期学习《泛函分析》的感受和认识。我本着这样态度写该笔记:1)了解泛函是什么,泛函的发展(很多教材把这个从略)2)把空间的理论知识系统学习,对于其他理论的学习作抛砖引玉之用。3)学习泛函的实际作用(也就是附录里的滤波器理论的应用)。 泛函分析是研究拓扑线性空间到拓扑线性空间之间满足各种拓扑和代数条件的映射的分支学科。它是20世纪30年代形成的。从变分法、微分方程、积分方程、函数论以及量子物理等的研究中发展起来的,它运用几何学、代数学的观点和方法研究分析学的课题,可看作无限维的分析学。 一、泛函分析的产生 十九世纪以来,数学的发展进入了一个新的阶段。这就是,由于对欧几里德第五公设的研究,引出了非欧几何这门新的学科;对于代数方程求解的一般思考,最后建立并发展了群论;对数学分析的研究又建立了集合论。这些新的理论都为用统一的观点把古典分析的基本概念和方法一般化准备了条件。 本世纪初,瑞典数学家弗列特荷姆和法国数学家阿达玛发表的著作中,出现了把分析学一般化的萌芽。随后,希尔伯特和海令哲来创了“希尔伯特空间”的研究。到了二十年代,在数学界已经逐渐形成了一般分析学,也就是泛函分析的基本概念。 由于分析学中许多新部门的形成,揭示出分析、代数、集合的许多概念和方法常常存在相似的地方。比如,代数方程求根和微分方程求解都可以应用逐次逼近法,并且解的存在和唯一性条件也极其相似。这种相似在积分方程论中表现得就更为突出了。泛函分析的产生正是和这种情况有关,有些乍看起来很不相干的东西,都存在着类似的地方。因此它启发人们从这些类似的东西中探寻一般的真正属于本质的东西。

相关主题