早期工作项目总结

来源:互联网 发布:matlab提取矩阵某一行 编辑:程序博客网 时间:2024/06/11 12:43

2011.3-2011.5 RTSP学习

RTSP: 多媒体实时播放控制协议,用户可以pause/continue。

主要的方法有: 

OPTIONS : 询问有哪些方法可用

DESCRIBE: 获取多媒体初始化信息,使用SDP协议

SETUP:设置会话属性,传输模式和 与server建立会话连接(包括客户端端口 和 服务器端端口 的分配)

 TEARDOWN, PLAY, PAUSE.


2011.1-2011.3 内核驱动学习笔记

1. 写内核驱动代码有一个固定的模式, 对应的makefile文件也是。 

#include “linux/modules.h"#include "linux/init.h"#include "linux/kernel.h"MODULE_LICENCE("版本权限");编写自己的函数, 例如:my_open() / my_read() / my_write() / my_ioctl() struct file_opetation scull_fops ={.open = my_open;.read = my_read;.write = my_write;.ioctl = my_ioctl;};入口函数  int __init my_init() {...}出口函数  void __exit my_exit(){...}
2. j建立内核驱动,需要获取设备编号。 ( ls -l /dev/  可以看到)

register_chrdev_region() / unregister_chrdev_region() / alloc_chrdev_region().   alloc_chrdev_region()动态获得编号,不能提前在/dev下创建节点,需要先读取 /proc/modules文件。

3. 内核在内部使用 struct cdev 结构体来表示字符设备。

cdev_init() / cdev_add()  用于向内核添加一个驱动设备,它的返回值就表示某个字符设备。

cdev_del()

定义自己的类型,包含struct cdev类型。 用户在open()操作的时候, 让 file->private_data指向这个 struct cdev实例。 之后read() / write() / ioctl() 都可以通过 file来坐坐cdev实例。   copy_to_user()/ copy_from_user() 用于内核空间与用户空间的数据拷贝。

4. 并发: 互斥锁(init_Mutex/ down/ up)   completion机制: init_completion/ wait_for_completion

5. 字符设备:是一种可以当作一个字节流来存储的设备。例如:键盘

    快设备: 系统中能够随机访问固定大小数据片的设备叫做快设备。例如硬盘



2010.3-2010.12  MyTest测试框架

MyTest 是三星内部使用的测试框架,类似于google的 gtest。 那为什么我们不使用gTest,而是要自己搞一套测试框架了?  

基于以下几个方面的考虑:

1. 压力测试。 我们某些测试用例,需要连续测试1万次或者10万次,查看性能及内存泄漏。 需要在配置文件中设置测试用例重复的次数。

2. 环境: 要同时支持ARM平台及window平台。  嵌入式平台很复杂,测试工具只能以动态库的形式嵌入到系统中,而不能以exe形式运行。

3. 配置文件: 我们需要有配置文件, 你们可以配置运行哪些测试用例,运行多少次。

4. 由于window平台上面没有默认的正则表达式库,我们这里用到了 boost 你们的 regex库。

项目架构:


如上图所述, 

1. 需要一个Manage作为管理类,下面有分为 Config Manage, Output manage, Runner Manage 三个类。 

2. 有一个操作系统的适配层。用于保证对上层提供一致的接口,保证与操作系统无关。

3. 配置文件 gtf.conf 里面列举了TS/TC ,测试次数,输出文件名 等信息。可能我们写了10个测试用例,保存在全局的list中, 但我们只想测试其中的5个测试用例,我们可以把这5个测试用例的名字写在gtf.conf 配置文件中。 Runner Manage类的功能就是读取gtf.conf中的测试用例名,与全局的list进行匹配。如果成功,就执行这个用例;如果失败,就跳过。

4. 提供了大量的比较宏: MT_ASSERT/ MT_CHECK

5. 结果保存的方式有三种;*.log 是实时log文件; *.csv 是统计后的文件;console是实时输出在终端的log,与*.log的内容一样。

6. 提供了写测试用例的宏: TEST_SUITE/ TEST_CASE

7. 增加了死亡测试: 核心功能是所有测试用例都是运行在一个新的进程里面,而不是一个线程里面。 这样,如果其中一个测试用例导致进程异常退出,仅仅只是这个进程退出,不影响别的进程,也就是说别的测试用例依然可以正常运行。


函数平台对比;

                      window                      linux

头文件          windows.h                unistd.h

时间函数      Sleep/GetLocalTime         gettimeofday/ sleep

管道              CreatePipe                        pipe

进程              CreateProcess                 fork



2008.8-2010.2   FOXCONN手机嵌入式APP开发

2008年毕业参加工作,在FOXCONN参与了 手机嵌入式APP开发工作,今天总结下:

硬件: 手机嵌入式

平台: window mobile 6.1

图形绘制引擎: Edgelib

场景:  短信及拨号界面开发

开发的UI界面如下:


                       图1-1                                                                    图1-2                                                                   图1-3


可以看到UI是有很多widget组成的(例如: button,gridlist ,text 等).   这些widget默认是hide的,只有在需要的时候被show出来。


拿短信这个APP来说,它被设计成一个Form。 这个form(它也是widget manager的特殊子类,widget Manager是Widget的子类),有很多widget Manager组成, widget Manager又有widget组成,结构如下:

这些widget/widget Manager/ Form都继承自 widget这个基类。 Widget里面定义了 handleEvent(), Display() 和 widget_ID变量。  Form里面采用组合模式,WidgetManager里面也采用了组合模式。 系统每个一段时间调用Form::Display()函数, Form::Display()会遍历调用所有widget的display()方法(这些widget默认是hide的,只有在需要的时候被show出来)。 


我在这个项目中,主要干了两件事情:

第一件事情: 消息转换

    手指点击屏幕,只能产生原始的 MSG_STYLE_UP/ DOWN / MOVE 事件及当前点击点相对于屏幕左上角的X,Y坐标,我需要把这些原始事件转化为widget可识别的事件(例如:点击,长按,滑动等)。 那么如何做到了?

   在创建每一个widget的时候,都会给出(top, left, width, height)坐标, 这样才能绘制出这个widget。  有了点击点的X,Y坐标,又有了所有widget的区间坐标范围,当然就可以确定是哪个widget被操作了, 然后调用 widget::handleEvent()响应这个操作。


网络查看windows的消息机制,介绍如下:

a. 鼠标点击,产生单击事件,鼠标设备驱动程序根据用户事件,转换成消息,并放置于WINDOWS的系统队列中

b. WINDOWS将系统队列中的消息取出,并投掷于消息对应的应用程序所属的线程队列。

c. 每个应用程序在创建时,系统都会为其创建一个消息队列,发送给应用程序的消息都存放在该消息队列中,等待被处理。 而应用程序的消息引擎

1
2
3
4
5
6
7
MSG msg;
 
while(GetMessage(msg, NULL, NULL, NULL))
{
      TranslateMessage(&msg);
      DispatchMessage(&msg);
}

会不停的从自己的专属消息队列中获取消息,并进行消息的翻译和转发(TranslateMessage和DiapatchMessage)

windows的消息机制,是知道鼠标点击在哪个控件上面的。 它怎么知道? 也是用的点击坐标是不是在某个控件的区域坐标范围内。  我们把window后台做的事情,实现了。


第二件事情: 使用状态机模式

还是拿短信APP来说,它有这样几个界面: 上面图1-2的界面, 写短信的界面, 及刚打开短信APP,出现短信list的界面,setting界面。  我们把每个节目设置成一个状态,用状态机来简化代码逻辑。


0 0
原创粉丝点击