uip移植笔记
Ui框架学习笔记

2.UI 消息机制....................................................................................................................................2 3.Chrome 控件树...............................................................................................................................3 4.Chrome 消息分发机制...................................................................................................................4 5.基本控件.........................................................................................................................................5
15条移动端实战UI-UE注意点

15条移动端实战UI-UE注意点在做手机产品设计的过程中,遇到很多看似很小,且很容易被忽略的问题,正是这些小问题,一次次的撩拨用户的耐心,让用户对你的产品心生怨念。
刚出道的朋友没有经过实战,对细节注意不多,往往都会遇到类似的问题,强调多次后,觉得不如写下来,给新人共勉。
苹果有他们自己的字体,一般iOS用苹果黑1、移动端产品原型设计中的像素规格顶栏一般是20px,如果是iPhone4、iPhone5的话,因为屏幕分辨率的原因,数值要翻倍,是44px。
按钮的最小值是44*44px,同样的,在iPhone4以上的设备里面要翻倍。
在android 里面也是差不多的,一般要求是44*44以上,不过iOS要求会严格一些。
具体的细节可以下载一个官方的iOS和android的UI设计规范。
2:、dp、dip、dpi、sp 等到底有什么联系区别?产生的根源和设计时的影响如何?是否屏幕密度的决定原因?UI设计师的角度理解:px(像素)是我们UI设计师在PS里使用的(不解释),同时也是手机屏幕上所显示的(也不解释)dp是开发写layout的时候使用的尺寸单位,sp是开发写layout时关于字体的字号单位,且dp与sp 总为1:1关系。
Android支持四种不同的dpi模式:ldpi mdpi hdpi xhdpi一般地,手机分辨率与所运行的dpi模式是匹配的,例如hvga(320x480像素)的手机屏幕一般在3.5英寸左右,运行在mdpi模式下(也有例外,稍后解释)(这个是ROM控制的,app 不能改变)。
当运行在mdpi下时,1dp=1px:也就是说设计师在PS里定义一个item高48px,开发就会定义该item高48dp;Photoshop中14px 大的字体,开发会定义为14sp。
对于一部wvga(480x800)手机(G7、N1、NS),一般是运行在hdpi模式下。
当运行在hdpi 模式下时,1dp=1.5px:也就是说设计师在PS里定义一个item高72px,开发就会定义该item 高48dp;Photoshop中21px大的字体,开发会定义为14sp。
uip 协议栈代码

uip 协议栈代码UIP协议栈是一种用于嵌入式系统的TCP/IP协议栈,它的设计旨在提供高效、灵活和易于移植的网络通信解决方案。
本文将介绍UIP 协议栈的基本原理、主要特点以及应用领域。
UIP协议栈的基本原理是将TCP/IP协议分成多个层次,每个层次负责不同的功能。
这些层次包括网络接口层、网络层、传输层和应用层。
网络接口层负责处理硬件接口和数据包的发送与接收,网络层负责处理IP地址和路由,传输层负责提供可靠的数据传输服务,应用层负责提供各种网络应用服务。
UIP协议栈的主要特点之一是它的代码量非常小。
由于嵌入式系统通常具有有限的资源,如处理器速度和存储容量,因此UIP协议栈的设计目标是尽量减小占用的资源。
为了实现这一目标,UIP协议栈使用了一些优化技术,如数据压缩和代码精简等。
这使得UIP协议栈非常适合于低功耗设备和资源受限的系统。
另一个重要特点是UIP协议栈的可移植性。
由于UIP协议栈是使用C语言编写的,它可以在多种嵌入式系统平台上运行。
UIP协议栈提供了一些通用的接口和配置选项,以便用户可以根据自己的需求进行定制。
这使得UIP协议栈可以广泛应用于各种嵌入式系统,如传感器网络、工业控制系统和物联网设备等。
UIP协议栈还具有良好的性能和可靠性。
它使用了一些高效的算法和机制,如快速重传和拥塞控制等,以提高数据传输的速度和可靠性。
同时,UIP协议栈还支持一些高级功能,如安全性、多播和多路径传输等,以满足不同应用的需求。
UIP协议栈广泛应用于各种嵌入式系统领域。
在传感器网络中,UIP 协议栈可以实现传感器节点之间的通信,用于数据采集和监控。
在工业控制系统中,UIP协议栈可以实现远程监控和控制,用于实时数据传输和设备管理。
在物联网设备中,UIP协议栈可以实现设备间的互联互通,用于智能家居和智能城市等应用。
UIP协议栈是一种高效、灵活和易于移植的TCP/IP协议栈,适用于各种嵌入式系统。
它具有小代码量、可移植性、良好的性能和可靠性等特点,广泛应用于传感器网络、工业控制系统和物联网设备等领域。
UCOS-II移植ARM的读书笔记

UCOS-II移植ARM的读书笔记导读:昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了,关键是我是第一次也是正式开始移植的学习之路啊,今天在工作之前先把昨天的笔记重新回顾一下,UCOS-II的移植需要提供2,真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作真是很郁闷,昨天晚上边看移植代码边记下来的笔记不知道怎么回事在保存的时候竟然不见了。
5555。
一个晚上工作的结果啊,关键是我是第一次也是正式开始移植的学习之路啊。
真是够倒霉的。
今天在工作之前先把昨天的笔记重新回顾一下,其实后来想想也许是件好事,可以让我今天在不借助其他的帮助的情况下自己看代码自己跟自己讲一遍,其实很多看起来是倒霉看起来是灰心的事情把我们的观点换一下那么就是一件好事。
这样的情况发生在我的身上已经挺多次了。
好啦,废话不说,开始补昨天的日记UCOS-II的移植需要提供2,3个文件分别介绍如下:一:OS_CPU.H1 与编译器有关的数据类型只是按照不同的编译器编写对应的数据类型的typedef对应于ARM7的数据类型的编写如下typedef unsigned char BOOLEAN; /* 布尔变量*/typedef unsigned char INT8U; /* 无符号8位整型变量*/typedef signed char INT8S; /* 有符号8位整型变量*/typedef unsigned short INT16U; /* 无符号16位整型变量*/typedef signed short INT16S; /* 有符号16位整型变量*/typedef unsigned int INT32U; /* 无符号32位整型变量*/typedef signed int INT32S; /* 有符号32位整型变量*/typedef float FP32; /* 单精度浮点数(32位长度)*/typedef double FP64; /* 双精度浮点数(64位长度)*/在上面定义的各种数据类型中按照ARM7的堆栈宽度选择INT32Utypedef INT32U OS_STK; /* 堆栈是32位宽度*/接下来一部分是为了兼容低版本UCOS的数据类型所编写的代码,在UCOS-II中暂不考虑2 与处理器相关的代码先定义中断的实现方式,预先设定的中断方式有三种,在ARM7中设置为方式2 #define OS_CRITICAL_METHOD 2 /* 选择开、关中断的方式*/接下来的一段是我暂时还没有完全搞懂的一部分,只知道是设定了12个软件中断的函数,当调用这些函数之前都会执行对应中断号的事情。
Android UI学习笔记

Android中的像素:(sp作为文字大小的单位,dp(dip)作为其他元素的单位)dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。
pt: point,是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用;sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。
由此,根据google的建议,TextView的字号最好使用sp做单位,而且查看TextView的源码可知Android 默认使用sp作为字号单位。
在Android 中,1pt 大概等于2.22sp以上供参考,如果UI 能够以sp为单位提供设计是最好的,如果设计中没有sp的概念,则开发人员也可以通过适当的换算取近似值。
过去,程序员通常以像素为单位设计计算机用户界面。
例如,定义一个宽度为300像素的表单字段,列之间的间距为5个像素,图标大小为16×16像素等。
这样处理的问题在于,如果在一个每英寸点数(dpi)更高的新显示器上运行该程序,则用户界面会显得很小。
在有些情况下,用户界面可能会小到难以看清内容。
与分辨率无关的度量单位可以解决这一问题。
Android支持下列所有单位。
px(像素):屏幕上的点。
in(英寸):长度单位。
mm(毫米):长度单位。
pt(磅):1/72英寸。
dp(与密度无关的像素):一种基于屏幕密度的抽象单位。
在每英寸160点的显示器上,1dp = 1px。
dip:与dp相同,多用于android/ophone示例中。
sp(与刻度无关的像素):与dp类似,但是可以根据用户的字体大小首选项进行缩放。
为了使用户界面能够在现在和将来的显示器类型上正常显示,建议大家始终使用sp作为文字大小的单位,将dip作为其他元素的单位。
移动应用开发课程笔记

移动应用开发课程笔记一、课程简介移动应用开发是当前非常热门的技术领域,涵盖了iOS、Android、小程序等多种平台。
本课程将介绍移动应用开发的基本概念、技术原理和开发流程,并通过实践项目来提升学员的实际操作能力。
二、课程内容移动应用开发概述移动应用市场的现状与趋势移动应用开发的技术架构与流程iOS开发基础Xcode开发环境配置Swift编程语言基础UI设计基础与控件使用数据存储与网络通信Android开发基础Android Studio开发环境配置Java编程语言基础UI设计基础与控件使用数据存储与网络通信小程序开发基础小程序开发环境配置WXML、WXSS与JavaScript基础UI组件库与API使用跨平台开发框架React Native框架介绍与环境搭建Flutter框架介绍与环境搭建实战项目开发简单的音乐播放器项目(iOS/Android)小程序电商应用项目(微信小程序)三、课程重点与难点Swift/Java编程语言基础:Swift/Java的语法规则、数据类型、控制流等基础知识是学习移动应用开发的基础,需要学员熟练掌握。
UI设计与控件使用:iOS/Android平台都有丰富的UI控件和布局方式,需要学员根据实际需求选择合适的控件和布局方式。
数据存储与网络通信:如何合理地存储数据和进行网络通信是移动应用开发中非常重要的部分,需要学员掌握基本的数据库操作和网络通信协议。
跨平台开发框架:React Native和Flutter等跨平台开发框架可以提高开发效率,但需要学员掌握原生开发和框架开发的区别和联系。
四、实验与实践项目安排实验1:熟悉Xcode/Android Studio开发环境,完成一个简单的Hello World程序。
实验2:使用Swift/Java编写一个简单的计算器应用。
实验3:使用SQLite数据库实现数据的增删改查操作。
实验4:使用网络通信协议实现数据的上传和下载。
实验5:使用React Native/Flutter框架实现一个简单的新闻阅读应用。
uIP地址解析协议ARP分析

地址解析协议 ARPuIP是什么?uIP是一款TCP/IP协议套件,该套件为使用者的网络会话提供网络协议栈支持。
我曾尝试将uIP提供的TCP/IP协议栈移植到单片机中,当然在只有单片机而没有网卡(MAC+PHY)的情况下,这项工作是不能完成的。
在做这项工作之前,我也在网络上搜索整理了很多资料,用以充实自己的知识体系。
单方面看,TCP/IP 协议栈是一组纵向生长的协议集合;多方面看,TCP/IP协议栈是实现双方正确,有效交互的一种机制,它实现了等层协议实体之间的透明传输。
而uIP是一款轻型TCP/IP协议栈,设计目标是为无法运行开源或者付费系统的广大接入终端提供一种网络接入交互机制。
鉴于国内几乎没有开发协议栈的工作,而国外一款比较好的协议栈大概在数十万美金,对于国内的很多软件开发,设备生产的公司来说,无疑是有点奢侈,因为我们的设备不需要对网络协议的完全支持。
对接入设备而言,“通道”和对“通道上的流”的规则,是他们的关注重点。
但是,就是这么简单的需求,对网络协议的最小化支持的软件,国内几乎无有。
以单片机为例,一个简单的网络模块就是给单片机外接资源增加一个网络控制器—一般是dm9000X或者marvell等厂家的以太网控制器,通过编程实现网卡驱动后(一般u-boot源码中都提供了这些厂家芯片的裸编程序),封装一个初始化、一个接收和发送接口,就可以同uIP整合,完成运行在单片机上的网络协议处理模块了。
UIP对基本的网络协议支持的比较好,当然一个人不是一个团队,开发协议栈还是相当有挑战性的。
我想将自己调试过程中遇到的问题,以及对uIP为什么这样做的理解,沿着我的思路做一个解说。
笔墨浅显,仅供自己和需要的人参考。
做这一系列的分析,前提需要一个主题框架。
但是一时又想不起来该怎么系统的完成这些任务,所以编边写边看,边看边修改。
二层请求协议:地址解析协议-ARP。
ARP/RARP作为一个二层协议,提供在局域网内请求对端MAC(ARP)地址或者逆向请求对端IP(RARP)地址的协议。
一步一步教你移植uIP

一步一步教你移植uIP0.9到8051+RTL8019AS追风发表于2010-11-11 22:21|只看该作者|倒序浏览|打印1. google一下uip,点击进入主页http://www.sics.se/~adam/uip/index.php/Main_Page当前最新的uIP版本是 1.0,这个版本比较复杂,所以还是移植历史版本吧.打开http://www.sics.se/~adam/old-uip/下载0.9版:http://www.sics.se/~adam/download/?f=uip-0.9.tar.gz2. 打开Keil新建项目uIP0.9.uv2, 设置项目属性.2 L( E/ A* h( C# e0 @6 mmemory_model 设置为large 模式,这样默认的存储方式是xdata6 |0 v5 H. { m0 Q5 V+ s: O因为uIP0.9编译后占用20K rom, 所以必须选一个32K(>20K)的rom的单片机,+ u* m8 p& T/ Z( o: f 比如Device可设置为SST89x58或者SST89x516xx,解压缩官方下载的uIP0.9压缩包,添加文件至项目, ) |4 M1 V0 C5 a' w; b! F3 ?- @, v' N% j5 u需添加至项目的文件有:uip\uip.c, uip.c\uip.h, uip.c\uip_arch.h,) y! x2 Q: E. A- a% p! l5 `uip.c\uip_arp.c,uip.c\uip_arp.h, I; I- G7 d: t0 ]& A8 dunix\main.c, unix\uip_arch.c, unix\uipopt.h,4 `: P* G, w$ m; S/ D, j* yapps\httpd\所有文件# j! B+ \7 |1 q1 c$ \5 ?3. 因为data是系统关键字, 所以标识符data => dat6 ~' C6 J& |4 ]4 M; Y2 i) }以下文件需要改动: fs.h, fsdata.h,httpd.c4. 为RTL8019AS 编写驱动程序(具体如何操作寄存器老古的网站有详细的教程),2 r- F3 k5 S, d- U. V e# M内容在压缩包中的RTL8019AS.c, RTL8019AS.h需要更改main.h中的如下地方:include "tapdev.h" => #include "rtl8019as.h"7 `- j$ i: d Y8 {: A/ ~tapdev_init() -> rtl8019as_init()0 Q4 p9 l$ a2 H8 X wtapdev_send() -> rtl8019as_send()5 F( X8 f1 {* b% Ntapdev_read() -> rtl8019as_read()5. fsdata.c 首行添加#include "fsdata.h"关键字替换: 6 h# K, [! S7 \* w5 h/ K$ L! C& u# o. Fstatic const char -> const char codeconst struct fsdata_file -> const struct fsdata_file code7 w4 \: h* c$ Q6 I( C4 Y* {fsdata.h 文件末尾添加:) M8 x6 I' d- X2 ^" T; W#define FS_ROOT file_tcp_header_html' [4 m1 V' B$ w' g6 x; b+ o5 G: @2 s) w+ l#define FS_NUMFILES 14) v4 l D5 l9 L* h6 R. f( A2 V* {9 {/ m5 l5 U3 @& \- a% x2 Y$ V; Uconst char code data_cgi_files[];const char code data_cgi_stats[];7 D/ M. D7 d' a0 H' cconst char code data_cgi_tcp[];const char code data_img_bg_png[];# D# ^: f. P1 _5 [( x+ w* L0 N/ M, V. o/ e" O/ O- hconst char code data_about_html[];' ^8 x& b6 w2 V+ t7 D( D% W7 O5 d ; q* z x0 e9 |$ F! ~const char code data_control_html[];const char code data_404_html[];( s/ w; A2 G. s+ V' s( k0 j2 F8 a3 T; Z: Iconst char code data_files_footer_plain[];2 f& i/ S& S4 p5 G# c const char code data_files_header_html[];const char code data_index_html[];. }$ `' ~7 `( H# u: `const char code data_stats_footer_plain[];const char code data_stats_header_html[];const char code data_tcp_footer_plain[];" b' d& w' p% M. k/ M( @const char code data_tcp_header_html[];4 I/ i7 U0 w4 P! M: J* B' R6 G- x) |: W/ j" Zconst struct fsdata_file code file_cgi_files[];$ r U8 D- [3 m! W$ A- E: S7 S4 _0 mconst struct fsdata_file code file_cgi_stats[];+ ?7 f/ f1 C# l1 F1 p; m/ h* H) m4 nconst struct fsdata_file code file_cgi_tcp[];0 _, E3 b8 W4 w- p- v: G$ W) H) R: Z% i: Vconst struct fsdata_file code file_img_bg_png[];+ |# o* \7 L+ q# |$ {( P7 a+ J$ s/ d2 \+ E2 T' Uconst struct fsdata_file code file_about_html[];9 u- E( D# F0 h, X# w) k! p' Z o, M/ A |const struct fsdata_file code file_control_html[];const struct fsdata_file code file_404_html[];, R& N' V3 p5 E" Y5 m3 M7 `% I% z8 b9 y6 t8 }/ Dconst struct fsdata_file code file_files_footer_plain[];4 b' y b. {4 L5 Gconst struct fsdata_file code file_files_header_html[];3 V: |4 V- r5 G' q; j8 ~' f/ F' J5 W m+ W' W2 l) ^! Y* {& _3 B/ q* tconst struct fsdata_file code file_index_html[];/ D2 b2 T4 Y2 s iconst struct fsdata_file code file_stats_footer_plain[];+ g9 `0 r8 t# E$ Z' }! ?1 y! A. @6 X Lconst struct fsdata_file code file_stats_header_html[];3 ?& p; i8 L' `4 z0 v) b' I5 r' K' z' Econst struct fsdata_file code file_tcp_footer_plain[];0 ~5 L+ B8 E3 [6 U0 Hconst struct fsdata_file code file_tcp_header_html[];6. fs.c 第55行删除: #include "fsdata.c"3 Y; ^) r3 f- _, D6 ~0 j" j7. uipopt.h1 l+ G, {, _) G( i. n181行: #define UIP_FIXEDETHADDR 0 -> 17 ^1 ?# f8 v( N2 R7 ?/ _) J; w( x' V5 o6 L& E299行: #define UIP_ACTIVE_OPEN 1 ->0& P4 i. h W% i' l- J0 X2 j+ a4 D& C, K+ D5 k$ I497行: #define BYTE_ORDER LITTLE_ENDIAN -> BIG_ENDIAN280行: #define UIP_UDP_APPCALL udp_appcall -> httpd_appcall# K) k4 b# |! @- [ `' @ q9 b+ Y: \" \文件末尾添加:5 c. W9 b4 L8 P! X+ ?, R+ z- q, {#ifndef NULL3 C4 u( ]5 x- P#define NULL (void *)0' W+ A& A( H& r# D {, _+ Z7 {) ]4 X$ Q- X( U6 G#endif /* NULL */! A4 l% ?" z& d% c+ d0 z8. httpd.c删除以下内容:+ g1 H% O2 t3 T. G- |8 o/ [extern const struct fsdata_file file_index_html;extern const struct fsdata_file file_404_html;7 q' H1 e$ X8 I" g4 {+ z7 u220行更改:G4 I; Q+ B5 L' ]/ S3 M& D' M1 G5 bfs_open(file_index_, &fsfile); => file_index_html->name. }/ u% h2 f8 z5 Y) I! J$ L% B224行同上更改9. 上电,开发板的webserver就启动了.具体的IP和掩码在uipopt.h 文件里面设置.。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本笔记适用于uIP1.0。
移植平台介绍:MSP430F149+cs8900a+IAR
1、阅读The uIP Embedded TCP/IP Stack The uIP 1.0 Reference Manual.
2、建立一个文件夹,起名myport,将uip-1.0下的uIP和lib两个文件夹拷贝过去,然后再在myport下建立app文件夹。
3、将unix子文件夹下的clock-arch.c、clock-arch.h拷贝到myport下,这个文件实现协议栈所用的时钟,由430的定时器完成,有三个函数:
clock_time_t clock_time(void)
{
return ticks;
}
void clock_init(void)
{
定时器的初始化工作
}
__interrupt void timer_interrupt(void)/*定时器中断函数*/
{
++ticks;
}。
4、将unix子文件夹下的uip-conf.h拷贝到myport下,这个文件实现协议栈所用的配置,按照需要修改之。
5、写cs8900a的驱动函数,这里采用8位、查询模式,替换tapdev.c 或slipdev.c。
6、将unix子文件夹下的main.c函数拷贝到myport下,这个是主调度流程,按照需要修改。
7、建立自己的工程,将以上文件包含。
8、调试,改错。
其中,uip的缓冲区是以字节数组的形式产生,为了保证它的起始地址是偶数,必须指定地址。
UDP的初始化如下
void myudp_init(void)
{
uip_ipaddr_t ipaddr;//定义IP类型变量
uip_ipaddr(ipaddr, 210,29,104,88); //远程IP为210.29.104.88
if(myudp_conn != NULL)
{
uip_udp_remove(myudp_conn);//如果连接已经建立,则删除之
}
myudp_conn = uip_udp_new(&ipaddr, HTONS(1000));//建立到远程ipaddr,端口为1000的连接
if(myudp_conn != NULL)
{
uip_udp_bind(myudp_conn, HTONS(2000));//绑定本地端口为2000,也就是2000-->1000 发数据}
}
void myudp_send(char *str,short n)
{
char *nptr;
nptr = (char *)uip_appdata;
memcpy(nptr, str, n);
uip_udp_send(n); //发送n个数据
}
void newdata()
{
char *nptr;
short len;
len = uip_datalen();//读取数据长度
nptr = (char *)uip_appdata; //取得数据起始指针
if(len<4)myudp_send("Please check the command!\n",26);
else if(strncmp(nptr,"getname",7)==0)myudp_send("My name is xiaomu.",19);
else myudp_send("Unkown command!\n",16);
}
/*---------------------------------------------------------------------------*/
/** \internal
* The main UDP function.
*/
/*---------------------------------------------------------------------------*/
void
myudp_appcall(void)
{
if(uip_udp_conn->rport == HTONS(1000))
{
if(uip_poll()) {
myudp_send("hello\n",6);//定时时间到,发hello
}
if(uip_newdata()) //如果指定IP的指定端口发来数据
{
newdata();
}
}
}
TCP的和这个差不多,初始化时就监听端口uip_listen(HTONS(23));
myudp_conn = uip_udp_new(&ipaddr, HTONS(0));//如果远程ipaddr为0,端口也为0,则可以接收来自任何ip任何端口的信息,但必须指定本地端口,即要绑定。
我修改了uip.c文件中关于UDP接收的部分,使它总是可以接收来自任何ip的信息,接收的数据的ip和端口信息保存在当前连接的结构体里面,可以用来回复信息。
如果想要主动发送信息,必须在每次发送前给当前连接的结构体赋值,因为我将UDP部分的代码修改为每次打好包以后将结构体的远端信息清零!详见我的移植代码。