搜索

tag 标签: 文章

相关帖子

版块 作者 回复/查看 最后发表
月度优秀主题/回复活动第23期如期到来啦~~ 为我们提建议&公告 eric_wang 2017-6-16 0 1313 eric_wang 2017-6-16 17:09
安卓手机怎么查看电脑中的PDF文件完美教学 attach_img 信息发布 华夏后裔 2017-6-16 0 1111 华夏后裔 2017-6-16 10:48
颁奖:TI OPA388 测评优秀文章颁奖! attach_img EEWORLD颁奖专区 EEWORLD社区 2017-6-14 6 233 xy598646744 2017-6-16 15:38
中午看了篇文章,满满感动:我的儿子死于1994,但是他的心脏停在2017 attach_img 聊聊、笑笑、闹闹 bootloader 2017-6-2 1 1049 maychang 2017-6-2 14:36
一篇文章读懂LoRa,转深度好文 attachment RF/无线 john_wang 2017-5-31 0 2050 john_wang 2017-5-31 15:40
在手机中怎么给PDF文件添加图片 attach_img 信息发布 华夏后裔 2017-5-27 0 707 华夏后裔 2017-5-27 13:39
针对手机及可穿戴设备的行为识别--Open.MEMS软件帮你做减法【ST工程师文章系列】 attach_img ST传感器与低功耗无线技术论坛 nmg 2017-5-25 6 779 dcexpert 2017-5-26 23:29
月度优秀主题/回复活动第22期如期到来啦~~ 为我们提建议&公告 eric_wang 2017-5-12 0 1515 eric_wang 2017-5-12 14:08
焊接步骤简述文章 信息发布 深圳吉美电子 2017-5-8 0 404 深圳吉美电子 2017-5-8 16:23
群7806363北京赛车交流群内大神很多 信息发布 非农我我 2017-4-15 0 1515 非农我我 2017-4-15 21:25
进口精品安捷伦E4428C信号发生器甩卖 attach_img 信息发布 ch605577061 2017-4-11 0 505 ch605577061 2017-4-11 10:53
TI CC1350 Sub1G/2.4G一板双频 等你申请测评! attach_img TI技术论坛 eric_wang 2017-3-24 23 3237 hrt014 2017-3-31 11:28
哪里有Bluetooth,IEEE 802.15.4,SMAC,Thread的特点和性能对比的文章? 【NXP Kinetis MCU】 bjemt 2017-3-22 2 1497 bjemt 2017-3-23 10:46
求助几篇英文文章 创意市集 logitech66 2017-3-18 7 2442 logitech66 2017-4-5 09:25
解析ST SOC蓝牙芯片 BlueNRG-1【ST工程师干货文章分享】 attach_img ST传感器与低功耗无线技术论坛 nmg 2017-3-11 4 2075 tang187 2017-6-26 10:11
ST工程师干货文章汇总帖,欢迎网友讨论 ST传感器与低功耗无线技术论坛 nmg 2017-3-9 3 3314 phcsuzhou 2018-9-8 16:17
ST惯性传感器自测试功能(self-test)简述【ST工程师干货文章分享】 attach_img ST传感器与低功耗无线技术论坛 nmg 2017-3-9 6 1026 jiezh 2017-3-13 22:39
关于ST惯性传感器的中断那点事【ST工程师干货文章分享】 attach_img ST传感器与低功耗无线技术论坛 nmg 2017-3-9 0 909 nmg 2017-3-9 12:16
如何判断传感器是否焊接正常【ST工程师干货文章分享】 attach_img ST传感器与低功耗无线技术论坛 nmg 2017-3-9 3 972 strong161 2017-3-11 22:19
膨胀罐有哪几种分类 信息发布 jiedeng 2017-3-15 0 404 jiedeng 2017-3-15 11:27

相关日志

分享 Linux学习日志(14)- uboot根目录下的config.mk文件学习
懒猫爱飞 2017-3-21 17:36
版权声明:本文为博主原创文章,未经博主允许不得转载,交流QQ:2912615383 本篇要学习的 config.mk 文件,位于 uboot 源码的根目录下, 其包含了子目录下许多同名的 config.mk 。所以千万注意这些同名文件的主次区别 该文件内容主要结构为: 1. 设置各种路径 2. 设置主机环境的编译选项 3. 确定各交叉编译工具 4. 确定各种级别的编译选项 5. 指定链接脚本 6. 获得起始链接地址 7. 设置头文件搜寻路径 8. 使用起始链接地址 9. 设置自动推导规则 设置各种路径 # 设置各种路径 ifeq ($(CURDIR),$(SRCTREE)) # 判断当前目录是否是顶层目录,如果是,设置 dir 为空 dir := else # 如果不是,那么 dir 路径为 (CURDIR) 去掉 (SRCTREE) 的部分 dir := $(subst $(SRCTREE)/,,$(CURDIR)) endif # 如果源码目录与输出目录不是同一目录 ifneq ($(OBJTREE),$(SRCTREE)) # Create object files for SPL in a separate directory # 且 SPL 是放在独立的目录下 ifeq ($(CONFIG_SPL_BUILD),y) # 如果 dir 不为空,则 obj 路径在 (SPLTREE)/dir/ 目录下 # 否则 obj 路径在 (SPLTREE) 目录下 obj := $(if $(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/) else # 如果 SPL 不是放在独立目录下 # 如果 dir 不为空,就放在 (OBJTREE)/dir 目录下 # 否则 obj 路径为 (OBJTREE) 目录下 obj := $(if $(dir),$(OBJTREE)/$(dir)/,$(OBJTREE)/) endif # 设置 src 路径 # 如果 dir 目录不为空,则 src 路径指向 dir # 否则指向 (SRCTREE) # 建立 obj 文件夹??? src := $(if $(dir),$(SRCTREE)/$(dir)/,$(SRCTREE)/) $(shell mkdir -p $(obj)) else # Create object files for SPL in a separate directory ifeq ($(CONFIG_SPL_BUILD),y) obj := $(if $(dir),$(SPLTREE)/$(dir)/,$(SPLTREE)/) $(shell mkdir -p $(obj)) else obj := endif src := endif 本段代码还是在进行原地编译和外部输出编译的一些路径设置 说到底,其实是把主 Makefile 中和路径有关的变量导入进来 下面几个 FLAG 清除,作用 … ?? # clean the slate ... PLATFORM_RELFLAGS = PLATFORM_CPPFLAGS = PLATFORM_LDFLAGS = ######################################################################### # 下面这两句不知道是什么意思,度娘也没有查出来 ... HOSTCFLAGS = -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer \ $(HOSTCPPFLAGS) HOSTSTRIP = strip # # Mac OS X / Darwin's C preprocessor is Apple specific. It # generates numerous errors and warnings. We want to bypass it # and use GNU C's cpp. To do this we pass the -traditional-cpp # option to the compiler. Note that the -traditional-cpp flag # DOES NOT have the same semantics as GNU C's flag, all it does # is invoke the GNU preprocessor in stock ANSI/ISO C fashion. # # Apple's linker is similar, thanks to the new 2 stage linking # multiple symbol definitions are treated as errors, hence the # -multiply_defined suppress option to turn off this error. # # 根据上面的英文解释,可能是为了兼容苹果系统的编译器,避免警告错误 ifeq ($(HOSTOS),darwin) # get major and minor product version (e.g. '10' and '6' for Snow Leopard) # 获取系统版本 DARWIN_MAJOR_VERSION = $(shell sw_vers -productVersion | cut -f 1 -d '.') DARWIN_MINOR_VERSION = $(shell sw_vers -productVersion | cut -f 2 -d '.') os_x_before = $(shell if ; then echo "$(3)"; else echo "$(4)"; fi ;) # Snow Leopards build environment has no longer restrictions as described above # 在雪豹系统上建议环境变量 , 我用的 uboot 是 2011.09 版本,所以当时苹果电脑还是用的雪豹版本 HOSTCC = $(call os_x_before, 10, 5, "cc", "gcc") HOSTCFLAGS += $(call os_x_before, 10, 4, "-traditional-cpp") HOSTLDFLAGS += $(call os_x_before, 10, 5, "-multiply_defined suppress") else # 其它情况就是 gcc 编译器 HOSTCC = gcc endif ifeq ($(HOSTOS),cygwin) # 设置标志位 HOSTCFLAGS += -ansi endif # We build some files with extra pedantic flags to try to minimize things # that won't build on some weird host compiler -- though there are lots of # exceptions for files that aren't complaint. # 同样是设置一些标志 HOSTCFLAGS_NOPED = $(filter-out -pedantic,$(HOSTCFLAGS)) HOSTCFLAGS += -pedantic 关于编译器的一些设置 ######################################################################### # # Option checker (courtesy linux kernel) to ensure # only supported compiler options are used # 下面这句话的意思是,测试 cc 是否支持第一个参数,然后根据返回结果选用不同的参数 cc-option = $(shell if $(CC) $(CFLAGS) $(1) -S -o /dev/null -xc /dev/null \ /dev/null 21; then echo "$(1)"; else echo "$(2)"; fi ;) # # Include the make variables (CC, etc...) # 定义交叉编译链工具 AS = $(CROSS_COMPILE)as LD = $(CROSS_COMPILE)ld CC = $(CROSS_COMPILE)gcc CPP = $(CC) -E AR = $(CROSS_COMPILE)ar NM = $(CROSS_COMPILE)nm LDR = $(CROSS_COMPILE)ldr STRIP = $(CROSS_COMPILE)strip OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS_COMPILE)objdump RANLIB = $(CROSS_COMPILE)RANLIB 设置 CPU 相关路径,配置文件等 ######################################################################### # Load generated board configuration # 加载配置文件 sinclude $(OBJTREE)/include/autoconf.mk sinclude $(OBJTREE)/include/config.mk # Some architecture config.mk files need to know what CPUDIR is set to, # so calculate CPUDIR before including ARCH/SOC/CPU config.mk files. # Check if arch/$ARCH/cpu/$CPU exists, otherwise assume arch/$ARCH/cpu contains # CPU-specific code. # 设置 CPU 的目录 CPUDIR=arch/$(ARCH)/cpu/$(CPU) # 检查 CUP 目录 ifneq ($(SRCTREE)/$(CPUDIR),$(wildcard $(SRCTREE)/$(CPUDIR))) CPUDIR=arch/$(ARCH)/cpu endif # 包含配置文件 sinclude $(TOPDIR)/arch/$(ARCH)/config.mk # include architecture dependend rules sinclude $(TOPDIR)/$(CPUDIR)/config.mk # include CPU specific rules # 包含上 CPU 的特殊配置 ifdef SOC sinclude $(TOPDIR)/$(CPUDIR)/$(SOC)/config.mk # include SoC specific rules endif # 根据生产商,设置板子路径 ifdef VENDOR BOARDDIR = $(VENDOR)/$(BOARD) else # 如果没有生产商,直接是默认的路径下 BOARDDIR = $(BOARD) endif # 如果找到,就包含上板子的特殊配置 ifdef BOARD sinclude $(TOPDIR)/board/$(BOARDDIR)/config.mk # include board specific rules endif ######################################################################### 关于编译器的一些设置 ifneq (,$(findstring s,$(MAKEFLAGS))) ARFLAGS = cr else ARFLAGS = crv endif RELFLAGS= $(PLATFORM_RELFLAGS) DBGFLAGS= -g # -DDEBUG OPTFLAGS= -Os #-fomit-frame-pointer OBJCFLAGS += --gap-fill=0xff gccincdir := $(shell $(CC) -print-file-name=include) CPPFLAGS := $(DBGFLAGS) $(OPTFLAGS) $(RELFLAGS) \ -D__KERNEL__ # Enable garbage collection of un-used sections for SPL ifeq ($(CONFIG_SPL_BUILD),y) CPPFLAGS += -ffunction-sections -fdata-sections LDFLAGS_FINAL += --gc-sections endif ifneq ($(CONFIG_SYS_TEXT_BASE),) CPPFLAGS += -DCONFIG_SYS_TEXT_BASE=$(CONFIG_SYS_TEXT_BASE) endif ifneq ($(CONFIG_SPL_TEXT_BASE),) CPPFLAGS += -DCONFIG_SPL_TEXT_BASE=$(CONFIG_SPL_TEXT_BASE) endif ifeq ($(CONFIG_SPL_BUILD),y) CPPFLAGS += -DCONFIG_SPL_BUILD endif ifneq ($(RESET_VECTOR_ADDRESS),) CPPFLAGS += -DRESET_VECTOR_ADDRESS=$(RESET_VECTOR_ADDRESS) endif ifneq ($(OBJTREE),$(SRCTREE)) CPPFLAGS += -I$(OBJTREE)/include2 -I$(OBJTREE)/include endif CPPFLAGS += -I$(TOPDIR)/include CPPFLAGS += -fno-builtin -ffreestanding -nostdinc \ -isystem $(gccincdir) -pipe $(PLATFORM_CPPFLAGS) ifdef BUILD_TAG CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes \ -DBUILD_TAG='"$(BUILD_TAG)"' else CFLAGS := $(CPPFLAGS) -Wall -Wstrict-prototypes endif CFLAGS += $(call cc-option,-fno-stack-protector) # Some toolchains enable security related warning flags by default, # but they don't make much sense in the u-boot world, so disable them. CFLAGS += $(call cc-option,-Wno-format-nonliteral) CFLAGS += $(call cc-option,-Wno-format-security) # $(CPPFLAGS) sets -g, which causes gcc to pass a suitable -gformat # option to the assembler. AFLAGS_DEBUG := # turn jbsr into jsr for m68k ifeq ($(ARCH),m68k) ifeq ($(findstring 3.4,$(shell $(CC) --version)),3.4) AFLAGS_DEBUG := -Wa,-gstabs,-S endif endif AFLAGS := $(AFLAGS_DEBUG) -D__ASSEMBLY__ $(CPPFLAGS) LDFLAGS += $(PLATFORM_LDFLAGS) LDFLAGS_FINAL += -Bstatic LDFLAGS_u-boot += -T $(obj)u-boot.lds $(LDFLAGS_FINAL) ifneq ($(CONFIG_SYS_TEXT_BASE),) LDFLAGS_u-boot += -Ttext $(CONFIG_SYS_TEXT_BASE) endif LDFLAGS_u-boot-spl += -T $(obj)u-boot-spl.lds $(LDFLAGS_FINAL) ifneq ($(CONFIG_SPL_TEXT_BASE),) # 指定起始地址 TEXT_BASE LDFLAGS_u-boot-spl += -Ttext $(CONFIG_SPL_TEXT_BASE) Endif TEXT_BASE 和 _start 的区别 : _start 是可以动态变化,而 TEXT_BASE 是链接时就确定的地址。 _start 是实际运行的地址,而 TEXT_BASE 是要 copy 到 sdram 中运行的地址 , 当然也是最终 u-boot 实际运行的地址。 u-boot 的 start.S 中在启动第一阶段会比较这两个值是否相等,不相等则会将自身 copy 到 sdram 中。 假设 _start 出是第一条执行的指令,并且 TEXT_BASE=0x27800000, 那么分两种情况说明: F 当 u-boot 被 download 到 nor flash 或被 copy 到内部 sram 时,假设被 copy 到的地址是 0x907000, 那么此时 _start 的地址是 0x907000, 此时就需要将自身 copy 到 TEXT_BASE 地方。 F 当 u-boot 本身就被 download sdram 的 TEXT_BASE 定义的地址出,那么此时 _start 本身的地址就是 0x27800000 了,所以和 TEXT_BASE 比较的结果相等而不用作自身代码搬移的工作了。 # Location of a usable BFD library, where we define "usable" as # "built for ${HOST}, supports ${TARGET}". Sensible values are # - When cross-compiling: the root of the cross-environment # - Linux/ppc (native): /usr # - NetBSD/ppc (native): you lose ... (must extract these from the # binutils build directory, plus the native and U-Boot include # files don't like each other) # # So far, this is used only by tools/gdb/Makefile. # 不同的系统设置不同的路径 ifeq ($(HOSTOS),darwin) BFD_ROOT_DIR = /usr/local/tools else ifeq ($(HOSTARCH),$(ARCH)) # native BFD_ROOT_DIR = /usr else #BFD_ROOT_DIR = /LinuxPPC/CDK # Linux/i386 #BFD_ROOT_DIR = /usr/pkg/cross # NetBSD/i386 BFD_ROOT_DIR = /opt/powerpc endif endif ######################################################################### # 设置环境变量??? export HOSTCC HOSTCFLAGS HOSTLDFLAGS PEDCFLAGS HOSTSTRIP CROSS_COMPILE \ AS LD CC CPP AR NM STRIP OBJCOPY OBJDUMP MAKE export CONFIG_SYS_TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS ######################################################################### 指定编译规则 ######################################################################### # Allow boards to use custom optimize flags on a per dir/file basis # BCURDIR = $(subst $(SRCTREE)/,,$(CURDIR:$(obj)%=%)) ALL_AFLAGS = $(AFLAGS) $(AFLAGS_$(BCURDIR)/$(@F)) $(AFLAGS_$(BCURDIR)) ALL_CFLAGS = $(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) $(obj)%.s: %.S $(CPP) $(ALL_AFLAGS) -o $@ $ $(obj)%.o: %.S $(CC) $(ALL_AFLAGS) -o $@ $ -c $(obj)%.o: %.c $(CC) $(ALL_CFLAGS) -o $@ $ -c $(obj)%.i: %.c $(CPP) $(ALL_CFLAGS) -o $@ $ -c $(obj)%.s: %.c $(CC) $(ALL_CFLAGS) -o $@ $ -c -S ######################################################################### # If the list of objects to link is empty, just create an empty built-in.o cmd_link_o_target = $(if $(strip $1),\ $(LD) $(LDFLAGS) -r -o $@ $1,\ rm -f $@; $(AR) rcs $@ ) ######################################################################### 最后,再吼一下俺的口号: 每天进步一点点,开心多一点 ^_^ --2017年3月21日 17:36:24
个人分类: linux学习日志|2360 次阅读|0 个评论
分享 RESTful架构详解(转)
wateras1 2016-7-10 12:27
1. 什么是REST   REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主要编写者之一。 他在论文中提到:“我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。REST指的是一组架构约束条件和原则。” 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。   REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。 所以我们这里描述的REST也是通过HTTP实现的REST。    2. 理解RESTful   要理解RESTful架构,需要理解Representational State Transfer这个词组到底是什么意思,它的每一个词都有些什么涵义。 下面我们结合REST原则,围绕资源展开讨论,从资源的定义、获取、表述、关联、状态变迁等角度,列举一些关键概念并加以解释。 资源与URI 统一资源接口 资源的表述 资源的链接 状态的转移    2. 1 资源与URI   REST全称是表述性状态转移,那究竟指的是什么的表述? 其实指的就是资源。任何事物,只要有被引用到的必要,它就是一个资源。资源可以是实体(例如手机号码),也可以只是一个抽象概念(例如价值) 。下面是一些资源的例子: 某用户的手机号码 某用户的个人信息 最多用户订购的GPRS套餐 两个产品之间的依赖关系 某用户可以办理的优惠套餐 某手机号码的潜在价值   要让一个资源可以被识别,需要有个唯一标识,在Web中这个唯一标识就是URI(Uniform Resource Identifier)。 URI既可以看成是资源的地址,也可以看成是资源的名称。如果某些信息没有使用URI来表示,那它就不能算是一个资源, 只能算是资源的一些信息而已。URI的设计应该遵循可寻址性原则,具有自描述性,需要在形式上给人以直觉上的关联。这里以github网站为例,给出一些还算不错的URI: https://github.com/git https://github.com/git/git https://github.com/git/git/blob/master/block-sha1/sha1.h https://github.com/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08 https://github.com/git/git/pulls https://github.com/git/git/pulls?state=closed https://github.com/git/git/compare/master…next   下面让我们来看看URI设计上的一些技巧: 使用_或-来让URI可读性更好   曾经Web上的URI都是冰冷的数字或者无意义的字符串,但现在越来越多的网站使用_或-来分隔一些单词,让URI看上去更为人性化。 例如国内比较出名的开源中国社区,它上面的新闻地址就采用这种风格, 如http://www.oschina.net/news/38119/oschina-translate-reward-plan。 使用/来表示资源的层级关系   例如上述/git/git/commit/e3af72cdafab5993d18fae056f87e1d675913d08就表示了一个多级的资源, 指的是git用户的git项目的某次提交记录,又例如/orders/2012/10可以用来表示2012年10月的订单记录。 使用?用来过滤资源   很多人只是把?简单的当做是参数的传递,很容易造成URI过于复杂、难以理解。可以把?用于对资源的过滤, 例如/git/git/pulls用来表示git项目的所有推入请求,而/pulls?state=closed用来表示git项目中已经关闭的推入请求, 这种URL通常对应的是一些特定条件的查询结果或算法运算结果。 ,或;可以用来表示同级资源的关系   有时候我们需要表示同级资源的关系时,可以使用,或;来进行分割。例如哪天github可以比较某个文件在随意两次提交记录之间的差异,或许可以使用/git/git /block-sha1/sha1.h/compare/e3af72cdafab5993d18fae056f87e1d675913d08;bd63e61bdf38e872d5215c07b264dcc16e4febca作为URI。 不过,现在github是使用…来做这个事情的,例如/git/git/compare/master…next。    2. 2 统一资源接口   RESTful架构应该遵循统一接口原则,统一接口包含了一组受限的预定义的操作,不论什么样的资源,都是通过使用相同的接口进行资源的访问。接口应该使用标准的HTTP方法如GET,PUT和POST,并遵循这些方法的语义。   如果按照HTTP方法的语义来暴露资源,那么接口将会拥有安全性和幂等性的特性,例如GET和HEAD请求都是安全的, 无论请求多少次,都不会改变服务器状态。而GET、HEAD、PUT和DELETE请求都是幂等的,无论对资源操作多少次, 结果总是一样的,后面的请求并不会产生比第一次更多的影响。   下面列出了GET,DELETE,PUT和POST的典型用法:    GET 安全且幂等 获取表示 变更时获取表示(缓存) 200(OK) - 表示已在响应中发出 204(无内容) - 资源有空表示 301(Moved Permanently) - 资源的URI已被更新 303(See Other) - 其他(如,负载均衡) 304(not modified)- 资源未更改(缓存) 400 (bad request)- 指代坏请求(如,参数错误) 404 (not found)- 资源不存在 406 (not acceptable)- 服务端不支持所需表示 500 (internal server error)- 通用错误响应 503 (Service Unavailable)- 服务端当前无法处理请求    POST 不安全且不幂等 使用服务端管理的(自动产生)的实例号创建资源 创建子资源 部分更新资源 如果没有被修改,则不过更新资源(乐观锁) 200(OK)- 如果现有资源已被更改 201(created)- 如果新资源被创建 202(accepted)- 已接受处理请求但尚未完成(异步处理) 301(Moved Permanently)- 资源的URI被更新 303(See Other)- 其他(如,负载均衡) 400(bad request)- 指代坏请求 404 (not found)- 资源不存在 406 (not acceptable)- 服务端不支持所需表示 409 (conflict)- 通用冲突 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突) 415 (unsupported media type)- 接受到的表示不受支持 500 (internal server error)- 通用错误响应 503 (Service Unavailable)- 服务当前无法处理请求    PUT 不安全但幂等 用客户端管理的实例号创建一个资源 通过替换的方式更新资源 如果未被修改,则更新资源(乐观锁) 200 (OK)- 如果已存在资源被更改 201 (created)- 如果新资源被创建 301(Moved Permanently)- 资源的URI已更改 303 (See Other)- 其他(如,负载均衡) 400 (bad request)- 指代坏请求 404 (not found)- 资源不存在 406 (not acceptable)- 服务端不支持所需表示 409 (conflict)- 通用冲突 412 (Precondition Failed)- 前置条件失败(如执行条件更新时的冲突) 415 (unsupported media type)- 接受到的表示不受支持 500 (internal server error)- 通用错误响应 503 (Service Unavailable)- 服务当前无法处理请求    DELETE 不安全但幂等 删除资源 200 (OK)- 资源已被删除 301 (Moved Permanently)- 资源的URI已更改 303 (See Other)- 其他,如负载均衡 400 (bad request)- 指代坏请求 404 (not found)- 资源不存在 409 (conflict)- 通用冲突 500 (internal server error)- 通用错误响应 503 (Service Unavailable)- 服务端当前无法处理请求   下面我们来看一些实践中常见的问题: POST和PUT用于创建资源时有什么区别?   POST和PUT在创建资源的区别在于,所创建的资源的名称(URI)是否由客户端决定。 例如为我的博文增加一个java的分类,生成的路径就是分类名/categories/java,那么就可以采用PUT方法。不过很多人直接把POST、GET、PUT、DELETE直接对应上CRUD,例如在一个典型的rails实现的RESTful应用中就是这么做的。 我认为,这是因为rails默认使用服务端生成的ID作为URI的缘故,而不少人就是通过rails实践REST的,所以很容易造成这种误解。 客户端不一定都支持这些HTTP方法吧?   的确有这种情况,特别是一些比较古老的基于浏览器的客户端,只能支持GET和POST两种方法。 在实践上,客户端和服务端都可能需要做一些妥协。例如rails框架就支持通过隐藏参数_method=DELETE来传递真实的请求方法, 而像Backbone这样的客户端MVC框架则允许传递_method传输和设置X-HTTP-Method-Override头来规避这个问题。 统一接口是否意味着不能扩展带特殊语义的方法?   统一接口并不阻止你扩展方法,只要方法对资源的操作有着具体的、可识别的语义即可,并能够保持整个接口的统一性。 像WebDAV就对HTTP方法进行了扩展,增加了LOCK、UPLOCK等方法。而github的API则支持使用PATCH方法来进行issue的更新,例如:   PATCH /repos/:owner/:repo/issues/:number   不过,需要注意的是,像PATCH这种不是HTTP标准方法的,服务端需要考虑客户端是否能够支持的问题。 统一资源接口对URI有什么指导意义?   统一资源接口要求使用标准的HTTP方法对资源进行操作,所以URI只应该来表示资源的名称,而不应该包括资源的操作。 通俗来说,URI不应该使用动作来描述。例如,下面是一些不符合统一接口要求的URI: GET /getUser/1 POST /createUser PUT /updateUser/1 DELETE /deleteUser/1   如果GET请求增加计数器,这是否违反安全性?   安全性不代表请求不产生副作用,例如像很多API开发平台,都对请求流量做限制。像github,就会限制没有认证的请求每小时只能请求60次。 但客户端不是为了追求副作用而发出这些GET或HEAD请求的,产生副作用是服务端“自作主张”的。 另外,服务端在设计时,也不应该让副作用太大,因为客户端认为这些请求是不会产生副作用的。 直接忽视缓存可取吗?   即使你按各个动词的原本意图来使用它们,你仍可以轻易禁止缓存机制。 最简单的做法就是在你的HTTP响应里增加这样一个报头: Cache-control: no-cache。 但是,同时你也对失去了高效的缓存与再验证的支持(使用Etag等机制)。 对于客户端来说,在为一个REST式服务实现程序客户端时,也应该充分利用现有的缓存机制,以免每次都重新获取表示。 响应代码的处理有必要吗?   HTTP的响应代码可用于应付不同场合,正确使用这些状态代码意味着客户端与服务器可以在一个具备较丰富语义的层次上进行沟通。 例如,201(“Created”)响应代码表明已经创建了一个新的资源,其URI在Location响应报头里。 假如你不利用HTTP状态代码丰富的应用语义,那么你将错失提高重用性、增强互操作性和提升松耦合性的机会。 如果这些所谓的RESTful应用必须通过响应实体才能给出错误信息,那么SOAP就是这样的了,它就能够满足了。    2. 3 资源的表述   上面提到,客户端通过HTTP方法可以获取资源,是吧? 不,确切的说,客户端获取的只是资源的表述而已。 资源在外界的具体呈现,可以有多种表述(或成为表现、表示)形式,在客户端和服务端之间传送的也是资源的表述,而不是资源本身。 例如文本资源可以采用html、xml、json等格式,图片可以使用PNG或JPG展现出来。 资源的表述包括数据和描述数据的元数据,例如,HTTP头“Content-Type” 就是这样一个元数据属性。   那么客户端如何知道服务端提供哪种表述形式呢?   答案是可以通过HTTP内容协商,客户端可以通过Accept头请求一种特定格式的表述,服务端则通过Content-Type告诉客户端资源的表述形式。   以github为例,请求某组织资源的json格式的表述形式:   假如github也能够支持xml格式的表述格式,那么结果就是这样的:   下面我们来看一些实践上常见的设计:    在URI里边带上版本号   有些API在URI里边带上版本号,例如: http://api.example.com/1.0/foo http://api.example.com/1.2/foo http://api.example.com/2.0/foo   如果我们把版本号理解成资源的不同表述形式的话,就应该只是用一个URL,并通过Accept头部来区分,还是以github为例,它的Accept的完整格式是:application/vnd.github .param   对于v3版本的话,就是Accept: application/vnd.github.v3。对于上面的例子,同理可以使用使用下面的头部: Accept: vnd.example-com.foo+json; version=1.0 Accept: vnd.example-com.foo+json; version=1.2 Accept: vnd.example-com.foo+json; version=2.0    使用URI后缀来区分表述格式   像rails框架,就支持使用/users.xml或/users.json来区分不同的格式。 这样的方式对于客户端来说,无疑是更为直观,但混淆了资源的名称和资源的表述形式。 我个人认为,还是应该优先使用内容协商来区分表述格式。    如何处理不支持的表述格式   当服务器不支持所请求的表述格式,那么应该怎么办?若服务器不支持,它应该返回一个HTTP 406响应,表示拒绝处理该请求。下面以github为例,展示了一个请求XML表述资源的结果:    2. 4 资源的链接   我们知道REST是使用标准的HTTP方法来操作资源的,但仅仅因此就理解成带CURD的Web数据库架构就太过于简单了。 这种反模式忽略了一个核心概念:“超媒体即应用状态引擎(hypermedia as the engine of application state)”。 超媒体是什么? 当你浏览Web网页时,从一个连接跳到一个页面,再从另一个连接跳到另外一个页面,就是利用了超媒体的概念:把一个个把资源链接起来.   要达到这个目的,就要求在表述格式里边加入链接来引导客户端。在《RESTful Web Services》一书中,作者把这种具有链接的特性成为连通性。下面我们具体来看一些例子。   下面展示的是github获取某个组织下的项目列表的请求,可以看到在响应头里边增加Link头告诉客户端怎么访问下一页和最后一页的记录。 而在响应体里边,用url来链接项目所有者和项目地址。   又例如下面这个例子,创建订单后通过链接引导客户端如何去付款。   上面的例子展示了如何使用超媒体来增强资源的连通性。很多人在设计RESTful架构时,使用很多时间来寻找漂亮的URI,而忽略了超媒体。所以,应该多花一些时间来给资源的表述提供链接,而不是专注于“资源的CRUD”。    2. 5 状态的转移   有了上面的铺垫,再讨论REST里边的状态转移就会很容易理解了。 不过,我们先来讨论一下REST原则中的无状态通信原则。初看一下,好像自相矛盾了,既然无状态,何来状态转移一说?   其实,这里说的无状态通信原则,并不是说客户端应用不能有状态,而是指服务端不应该保存客户端状态。    2. 5.1 应用状态与资源状态   实际上,状态应该区分应用状态和资源状态,客户端负责维护应用状态,而服务端维护资源状态。 客户端与服务端的交互必须是无状态的,并在每一次请求中包含处理该请求所需的一切信息。 服务端不需要在请求间保留应用状态,只有在接受到实际请求的时候,服务端才会关注应用状态。 这种无状态通信原则,使得服务端和中介能够理解独立的请求和响应。 在多次请求中,同一客户端也不再需要依赖于同一服务器,方便实现高可扩展和高可用性的服务端。   但有时候我们会做出违反无状态通信原则的设计,例如利用Cookie跟踪某个服务端会话状态,常见的像J2EE里边的JSESSIONID。 这意味着,浏览器随各次请求发出去的Cookie是被用于构建会话状态的。 当然,如果Cookie保存的是一些服务器不依赖于会话状态即可验证的信息(比如认证令牌),这样的Cookie也是符合REST原则的。    2. 5.2 应用状态的转移   状态转移到这里已经很好理解了, “会话”状态不是作为资源状态保存在服务端的,而是被客户端作为应用状态进行跟踪的。客户端应用状态在服务端提供的超媒体的指引下发生变迁。服务端通过超媒体告诉客户端当前状态有哪些后续状态可以进入。 这些类似“下一页”之类的链接起的就是这种推进状态的作用——指引你如何从当前状态进入下一个可能的状态。    3. 总结   现在广东XXX版本、XXX等项目中均使用传统的RPC、SOAP方式的Web服务,而移动南方基地XXXX项目的后台, 虽然采用了JSON格式进行交互,但还是属于RPC风格的。本文从资源的定义、获取、表述、关联、状态变迁等角度, 试图快速理解RESTful架构背后的概念。RESTful架构与传统的RPC、SOAP等方式在理念上有很大的不同,希望本文能对各位理解REST有所帮助。
个人分类: ESP8266 WIFI|487 次阅读|0 个评论
分享 晶振32.768KHZ已成发展趋势
zhaoxiandz 2016-5-20 17:30
作者:兆现电子 日期:2016年5月20日 32.768K是频率元器件中最常用的一种频率,而说到32.768K晶振的封装,最初我们知道最常用的贴片晶振封装有3.2*1.5mm(市场最常用的一种贴片封装);4.2*1.5mm(也是常用的一种封装);4.9*1.8mm(比前面两种封装都大,淘汰的比较快);6.0*2.1mm(不提及这个封装,相信很多人都已经忘记了这种晶振封装)。而当我说出这个晶振封装,相信你会嗤之以鼻。对,它就是最常用且在目前市场是最廉价的一种贴片晶振,体积7.0*1.5mm。让我们回到5年前,7.0*1.5mm封装晶振为代表的有爱普生晶振MC146,精工SSP-T7-F,这两个型号连行外人都熟悉不过了,在5年前,MC-146晶振价格曾经能卖到1.6元左右,而5年之后,价格骤然下降到0.6元以下,绝对是玩了一趟过山车。为什么价格会有如此悬殊了。晶振行业,价格除了被晶振的精度,负载电容,温度范围所控制,再一个体积能满足市场需求,也就是超小型,超轻薄,就能受到市场的欢迎。此段开头我们就介绍了最小体积3.2*1.5,可想而知,3.2*1.5mm比7.0*1.5足足小了一倍多。而现在3.2*1.5mm也是现在32.768K市场最受欢迎的贴片晶振 然而对于现在电子市场而言,3.2*1.5mm并不是最小封装的晶振,只能说相比4.2*1.5mm;4.9*1.8mm而言,3.2*1.5mm依然是被广泛使用最多的一种封装。但人们要认清,现在是科技时代,任何电子产品等都是超轻薄化。因此新一轮的小型化贴片晶振又出现在我们的眼球里。 32.768K全球最小型化的贴片晶振封装为1.2*1.0mm,全球能做到此款超小型化贴片晶振只有日本大河晶振,型号为FCX-08。 其次比1.2*1.0mm贴片晶振长度大0.4mm的1.6*1.0mm封装。能做到此封装的国外大型品牌有: 日本大河晶振型号为TFX-04; KDS晶振型号为DST1610; 爱普生晶振型号FC1610AN; CTS晶振型号TF16. 紧挨其上的为2.0*1.2mm贴片晶振,此款封装已经不足为奇了,但如果你肉眼观看,还是会感叹2.0*1.2mm贴片晶振会如此之小,不禁想到1.2*1.0mm贴片晶振摆在我们眼球,我们还能正常看待是一款贴片型晶振吗?如果说3.2*1.5mm贴片晶振以及7.0*1.5mm是一个时代,2012贴片晶振和1210贴片晶振是另外一个时代,那么现在的2.0*1.2mm贴片晶振即将是过去五年里的7.0*1.5mm贴片晶振,而1210贴片晶振才是现在流行的3.2*1.5mm贴片晶振。从以下可以做到2012贴片晶振的企业来看,就知道2012贴片晶振已经要发展成为一种趋势了。 KDS晶振对应型号为DST210A; 京瓷晶振对应型号为ST2012SB; NDK晶振对应型号NX2012SA; 爱普生晶振FC-12D/FC-12M; CTS晶振对应型号TF20/TF20L; 放一段2012贴片晶振,1612贴片晶振,2520贴片晶振的对比图,大家可以自行想象一下,未来1210贴片晶振到底有多小 总结:以上兆现电子为大家分析了5年前MC146晶振的价格行情,以及目前最受欢迎的32.768K小型化的贴片晶振,及未来小型化贴片晶振的流行趋势。 晶振封装是一种太容易人头痛的的参数。想要学习晶振的朋友,瑞泰提供的技术文章相信会帮到您。
555 次阅读|0 个评论
分享 转载 文章:Virtex II Pro 开发板三种FPGA的配置方式
logitech66 2015-11-6 17:50
转载链接:http://blog.chinaunix.net/uid-7547035-id-60208.html 摘要:本文主要叙述了Virtex-II Pro FPGA开发板的三种FPGA配置方式,以及iMPACT软件的使用。 关键 词:FPGA配置,iMPACT,Virtex-II Pro 图1.Virtex-II Pro FPGA开发板 Virtex-II Pro FPGA开发板(图1)提供了三种方案来解决对FPGA的编程。 JTAG 配置 这是一种很通用的编程方式,利用PC机直接将FPGA的配置文件通过JTAG编程到FPGA芯片中。 PROM配置 首 先是将FPGA的配置文件放到PROM进行存储,上电之后,PROM通过串行或者并行的方式将配置文件下载FPGA芯片。Virtex-II Pro开发板PROM对FPGA的编程用的是并行的方式。 SystemACE Controller通过CF卡进行配置 这个是 Xilinx提供的一种独有的FPGA配置方案,即通过SystemACE Controller将存储在CF卡中的配置文件下载到FPGA中,最多CF卡中可以存放8个配置文件,通过外部的拨码开关进行配置文件的选择。如果有人 在Virtex-II Pro开发板上做过Linux的移植的话,还应该知道CF卡存储的不仅仅是FPAG的配置文件,还可以将处理的数据,或者文件系统放到卡中。 实 验环境的要求: IMPACT10.1 Virtex-II Pro 开发板 USB ISP下载线 CF卡以及CF卡读卡器 串口调试线(可选) 下 面具体介绍这三种方式的操作 1.JTAG配置 Virtex-II Pro FPGA板上电,并通过ISP下载线与主机相连。开发板的SW9拨码开关1、2键都应该是off,D20 LED(JTAG CONFIG)会变亮。打开iMPACT软件,默认建立工程。或许软件会自动识别与主机相连的器件。如果没有的话,需要在右侧的操作窗口,右键选择 Initialize Chain(Ctrl+I)(图2),然后会自动识别下载线上的设备(图3)。 注:D20是指开发板上的对应器件的编号,下面也会有类似的 表述。 图2.初始化下载链 图3.识别的设备 图2中,xcf32p也就是32MB的PROM芯片,xccace就是System ACE,xc2vp30也就是FPGA芯片。 如果使用JTAG,右键选中xc2vp30,选择Assign New Configuration file(*.bit文件)如图3 图4.给FPGA芯片指定配置文件 选完之后,同样右键选中xc2vp30,选择program,默认选 项,然后点击OK,系统自动下载,等下载成功后会有提示。在开发板上的D4 LED(DONE)会亮,说明FPGA配置成功。 2.PROM配置 Virtex-II Pro 开发板的XCF32P,Flash PROM包含了预留了两个块:revision 0和revision 1。revision 0是用于Golden配置这种模式,这块区域写跟擦除都是保护,里面主要存储了该板子的测试程序。而revision 1 用于用户模式,用户生成的配置文件都是存在于该区域中,当然可以配置多个文件。这里主要用的就是revision1的区域。 在配置 PROM之前,需要生成PROM需要的是*.mcs文件,而该配置文件又是需要*.bit文件。具体步骤如下: 图5.操作流程 在iMPACT软件的Flows工作区双击PROM File Formatter,进入Prepare PROM Files对话框(图6)一般都是默认选项,在下面有存储路径的选择和PROM file name的选择。 图6. Prepare PROM Files 点击Next,选择PROM mode(图7),我们选择的是Parallel Mode。参考Virte-II Pro 开发板的电路图可以了解到PROM的数据输出口是8bit,所以选择并行模式。 图7.Select PROM/Flash Mode 点击Next,选择PROM device,Virtex-II Pro使用的xcf32p,所以我们选择的32M,点击Add,因为我们选择一个配置文件所以只需点击一次即可。 图8.指定PROM Device 一路点击Next,最后点击Finish。然后会跳出添加设备文件的对 话框。点击ok, 图9.Add Device 然后选择你需要的配置的*.bit文件。一路默认OK。完成后,然后会提示添 加Another device,点击取消就可以了。在左侧的iMPACT Processes栏中 双击Generate File,在刚才指定的路径下会生成*.mcs文件(图9)。 图10.mcs文件 在左侧Flows工作区中选择Boundary Scan。右键选择xcf32p,Assign New Configuration File(图10),添加刚才生成的*.mcs文件。 选择完后,还是右键选择xcf32p,选择Set Programming Properties,进行Programming的配置。 图11.添加配置文件和设置编程属性 这是一般的编程配置属性(图12),Parallel Mode需要选上,否则无法正确配置FPGA。 图12.参数设置 右键点击program,然后慢慢等待对PROM的编程,真的是很漫长啊,可以抽空泡杯 茶喝。 图13.下载进程 最后会提示完成,如果SW9 1 ON,2 OFF,D19(PROM Config)会亮,然后安装Reset键几秒钟时间,D4(done)会变亮,说明PROM配置FPGA成功。 3.Compact Flash配置 Xilinx提供了另一种配置方案就是SystemACE Controller,利用System ACE可以将配置文件放到CF卡中对FPGA进程配置。所需要的配置文件是*.ace文件。 同样在左侧的Flows中选择 SystemACE,跳出对话框,在Prepare System ACE Files中选择Novice,点击Next,选择CF的大小,如下图,因为我使用的是32MB的,所以选择Generic,因为我只用一个配置文件,所 以预留0个空间(图13)。点击Next 图14.选中CF卡的大小 下一步是选择生成文件的文件名和路径。点击Next。Virtex-II Pro通过SystemACE 可以同时支持8个配置,需要通过板子上的SW8,3bit的拨码开关去指定8个配置中的一个。(图15)。 图15.选择配置地址 然后点击Finish。下一步是在每一个rev*添加相应的*.bit文件。共8个 bit文件(图16)。 图16.向rev0中添加bit文件 (图17)在iMPACT Processes点击Generate File,完成后;然后通过读卡器接上CF卡,然后点击Copy to Compact Flash,会自动将生成的文件放到CF卡中。 图17.ace处理 图18,CF卡中的文件目录 图18 中.xilinx.sys内容是: #Automatically generated. PLEASE DO NOT MODIFY. dir = LED_test; cfgaddr0 = rev0; cfgaddr1 = rev1; cfgaddr2 = rev2; cfgaddr3 = rev3; cfgaddr4 = rev4; cfgaddr5 = rev5; cfgaddr6 = rev6; cfgaddr7 = rev7; 由软件自动生成。该文件需要是用来指定配置文件的路径。 图19中的每个rev*目录下面都有一个*.ace文件。 CF 卡插入板子上,SW9 1、2都是off,D20(JTAG config)会变亮;然后D12会变黄色,D4(Done)会变亮,如此说明CF卡配置FPGA成功。通过SW8的控制来选择CF卡中的其他配置文件, 然后按住重启键SW1 若干秒,如果D4(done)变亮说明配置成功。 注CF卡的格式必须是Fat12/16,需要用mkdosfs命令进行格式化
775 次阅读|0 个评论
分享 存档:要干的事情(六月版)
热度 2 辛昕 2015-7-6 23:00
马上就六月份了。 要干的事情,还置顶,这样的文章显然不可能永远就一篇,于是我干脆打算一个月什么的写一篇的,只置顶最新的。 没必要也不想再说什么“最近依然很忙乱”什么的,这个恐怕是常态。 上周六考完试,突然似乎松下了一个很大的包袱,我可以有大把时间和放松的心去做很多之前 一直打算“考完试”再做的事情。结果当然不出所料的一团糟——因为啥都想掺和一脚。 直到昨晚开始,我才开始搞房间的卫生,收拾桌上的各种乱七八糟的东西——房间的混乱实在太影响心情和观瞻了。加上这一周前几天天气一直下雨,各种衣服没干,即使早上起来我洗个澡再去上班,依然没办法改变身上的衣服没干透,贴着自己不舒服——我当然不是什么豌豆公主豌豆小王子,但所有这些,确实会加强“一切都不是很舒适”的感觉。真正的舒适轻松,其实真的是一件需要从周遭的生活环境到自己的生理感觉都舒适才能产生的心理上的轻松。 不说了,说回正经事。首先是上个月的事情简单整理: 已做完的: 1.《且听风吟》这本书已经解决了——因为其实这类书不该着急看完,这次实在是有其他目的,昨晚了结; 2. 嵌入式Linux(Embedded Linux) 其实当时想要做的早就搞定了;现在遇到的问题其实是当时没设想过的做的这一步,不过我想,似乎下一步进一步的计划是要理解这玩意的启动过程;对单片机这类问题我现在已经很熟悉,唯独这个Linux,我总是寄望可以不管那么多,看来,真的没这个命。 实际上,五月版的清单里,我真正做了的只有这两件。 剩下的,不想重复提及,但毕竟这是新的一个月份,所以我只把它们简单一句话继续顺承下来: 橙色字体部分,表示这个月最好端了,收拾了的东西; 1.《Code Reading》 final,这书我还是扫完了,只不过,看得很快,因为,我很快就意识到,尽管这里面确实有我想知道的东西,但如果我没真正经历过一次 阅读某个源码,我始终是无法理解那些内容,一点都不能。 所以这件事情到此为止。接下去我会考虑的是,怎么开始阅读 Linux源码,以及目的是什么? 这个还是提提:经过上次的清理我发觉我要放下很多期望,如果只是扫一下,我觉得我可以用每晚一点时间慢慢扫完它; 这本书我至今没开始读,原先只是简单看了第六章。因为这几天被其他几件事,这样是不行的。anyway,最迟到周末,我一定要正儿八经开始看,既然是正儿八经,至少这周内就看完一到两章,并做简要的笔记。 因为这些我圈定的章节,确实是我需要的东西。 2.OpenWrt 汇报一下,昨晚和今天折腾了一下这玩意。目前的进展是: 1.把它变成第二个路由器,通过我原来的路由器连到外网,可以直接通过它连到外网; 2.设置了root密码,学会了简单的配置网络,当它连着电脑时,可以ssh登录(当然此时也可以连外网) 3.但是,当我电脑连路由器的时候,无法远程ssh登录它——感觉里觉得这里头本身就有问题,什么问题呢?似乎在同一个子网里是不可以的?还是说要怎么设置一下才可以,不过这个不会,看来要好好看看openwrt官网的资料了。 就是说,关于这个板子本身的教程和要玩的东西,至此结束。 呼~终于把这玩意折腾开了~~ 3.UI 最新进展: 周日下午我文艺了一把,不过也把这个事情做了开来。 我在咖啡厅里,从试图总结原有方案,然后继续琢磨如何在原有方案上继续添加下去。最后我发现,因为UI的细节实在太多,而我重新做的时候,因为我始终没把这个UI的整体框架做到了然于心,也一直没能写出完整的文档。所以我一直是等同于第一次做那样,自下而上一点点积累,却因为回想到我原来的方案已经实现了的东西,结果是不上不下,所以一直做不开。 最后因为考虑到最近把这个原来做的方案整理过一次,当前整理出来的结果让我个人相当满意,所以我一狠心,干脆放弃了原先自己从头搭建的半成品,直接从这个来移植,因为昨天下午我什么都没带就带了笔记本,我也不给自己其他机会做别的事,所以我憋了一口气,撑着把这个东西做下来,所以虽然我还没有完成从 tft到12864 驱动的改变以及一些其他我在重新做的过程中吸纳的一些新想法,但至少我把它脱离原来的工程环境单独通过编译了。 并且在最后十五分钟,大致厘定了接下来要做的事情,这次十分具体,因为这次是自上而下做的。 现在想起来,以前在对于 自上而下自下而上这类话题的时候,我一直没有把握代码的规模这些粒度问题,事实上像这种粒度的模块,而且特别还是自己早已经实现过一次的方案,实在不该玩什么 自下而上,宁可认真整理也不要真的再走一次自下而上,因为这种思路太容易让设计基线发生变动了,而且看不到完成的尽头。 关于这一点,从一些应聘信息中我看到,大家更倾向于使用业界成熟的方案,如UCGUI之类的,我想这也将是我最后一次自己试图实现这种简单的UI方案。以后我都将考虑使用现有方案,除非我最后再次发现我有可以借 鉴和改进的空间。 最近上班,结束了那些改板的杂事我又开始修改程序,又涉及到这一部分,项目的进展让UI的需求又有了新要求,其中一部分验证了我最初的想法,也出现了一些我原先没有预料到或者我还是没法实现的目标,所以我想,我一定要在这两个事情上尽快取得一个连接点——那样我就不必重新从头构造,省去许多时间,同时,我业余的努力可以对工作的内容有所帮助。而我之前,因为对工作上已经完成的那个体系不够满意,因此迟迟没有直接移植过来用。导致我从头在12864上构建的时候花费了大量精力和时间。 而我昨天在检查之前那个经过整理的体系后,突然发现它已经在很大程度上符合我当前的要求了,大可直接移植过来,放弃重新构建。 另外我原先打算,先完成这个,再去借鉴现有的方案,但事实证明,我自己被需求推动产生的想法,需要相当的时间,而我如果开始去研究现有的方案,很可能可以马上获得一些启发——甚至我就直接放弃我自己构建的想法了。 当然,眼下事情太多,我精力有限,我决定先不折腾这些,暂时只打算直接移用我现在的方案。 这件事情我必须给它设定一个停止条件:就算判定它失败,遭受我的放弃也可以,因为实在拖了太多时间。 分散了我的精力,而他们很可能是没有太大意义的。 但,不管是工作上花的时间,还是我业余的一些尝试,它们都是我过去一年多主要的尝试,我还是希望它们给我留下一些可以将来写在简历上的东西,所以我最好还是花时间整理整理。 我希望从中得到什么,又大概要花多少时间,是不是我能承受的? 4.ENC28J60+LWIP/UIP 5.Ubuntu下 编译和烧写stm32单片机程序 (LATEST STATUS)这件事情,可以暂时了结了,因为相关的内容,已经属于新的事项了。 当前我为这个事情,牵扯到要进一步学习熟悉GCC、make的相关选项,同时还有更重要的就是熟悉codeblocks这个跨平台的开源免费ide。 已经有点偏离这件事情了,为了防止这个事件的范围蔓延,就此收住。唯一要做的下一步就是修改makefile,把它做成一个通用的模板。 即使只是在shell下 make又算什么呢?我又不是一天两天玩shell 只是 编译 和 烧写,什么该死的 gdb/gdbserver,甚至更远的的 Codeblocks环境设置、DDD图形化GDB都扔一边; 报告一下,昨晚简单弄了一下: 首先偶用gcc编译已经编译成功了(至少看起来没错误),就是不知道为啥烧进去以后没反应 ,后来回想了一下很可能是因为在windows xp下iar的时候,我是有选项设置成烧录flash,而在这里我却不知道到底这一个动作是该在gcc编译时以什么命令完成还是在stlink烧录时如何设置,看来还得看资料; 另外一个要解决的也是最基本的事情就是,确实如我此前所想,因为我没把他的环境变量设置好,或者干脆把它的安装文件放在 /usr/local/bin下所以导致我之前非sudo无法运行挺不爽。这个倒是非常轻松的解决。 接下来我觉得让程序烧进去能跑起来不算太大的事情,然后我就是要稍微整理一下编译make脚本和烧录命令啥的,方便以后使用,至少写个应用笔记之类的。 好吧,洗澡,换衣服,吃饭~~ 刚发现还是不行,在研究各种 启动文件 一类的东西的时候,我想了想,决定试试源头那个github上下载到的stm32f3discover的板子,然后我发现它是可以的。 如此说来,我需要在ubuntu下重新按照这个整理一个stm32f030的版本——不过我突然发现stm32者一部分的文件很乱,所以我还是决定先整理整理先,这就类似于 下面的 第10个任务,所以,我决定回到windows下,因为我要确保那些东西在iar下可用,须知道我目前大多数自己的程序都在这个基础上完成的,如果他们弄坏了,我可就很麻烦~~ 不知道为什么,我重新从stm32f3discover的例程逐个逐个修改过来,但始终不行,但我得板子本身却是好的,而且我也试过用其他地方编译好的bin用stlink烧下去也是对的...... 最后不得已我再次回到github想搜索个现成的,搜是搜到的,就是该死的又是stm32f051的,我当时真是非常郁闷,st脑子到底想什么,同一个f0系列出两个板子。 想了想我不折腾了,先买一个板子吧,淘宝看了看还行不贵,50多一点,买吧。反正有一个可用的,我再改回来希望就大了。 这事情,就暂时到这里吧。折腾了一天。我还是想想加班的事情吧,很多次很多次焊电路都这么垃圾,这次得系统性来一次,像写程序那样去做。 最新进展,在我折腾openwrt的时间里,stm32f051的板子到了,切回到Ubuntu下,把那个在github上搞到手的gnu-arm编译的例程折腾了一下,烧下去,done!太好了。 接下来我想靠着这个东西,把stm32f030搞定应该不是太大问题,不过暂时不想弄了就是,反正也11点了,今晚一回来就洗完了澡,接下去差不多有一个小时的时间,干点别的,该看的书啥的,理一理,还有一些别的事情,该整的都好好整~~ 可以了,不用多想了,大概就是相应的 makefile什么的不对的原因。 因为无意在网上搜索到一个一个老外配置codeblocks的文章,突然发现我大致能看懂了,不妨试试,毕竟做成ide的方式还是很棒的。但没把握,试试,下午突然困想躺一下,居然睡着了,做了莫名其妙的一个梦。 6.基于Qt的开源助手(**) 7.跑各种各样的咖啡馆,解答一个开的下去开不的下去的疑惑(**) 这个其实很需要我有时间到处跑,而这阵子,我实在是想好好呆在家里做其他事,所以估计暂时也只能不做了。 8.陶弘景的 养性延命录 和 哈佛商学院全球案例库 对于前者,我突然觉得我先解决 慢性咽喉炎 如何 慢性需慢治 和 脚底又生脚气,以及先把作息矫正过来(比如不要再像今晚这样12点半过后才睡,什么的再说吧。) 至于 哈佛商学院全球案例库,我觉得,在 Code Reading这本书看完后可以开始; 9.清理一下电脑里的那些代码 事实上,我最近把工作电脑盘里全部如数烤到我的移动硬盘里,如果要整理,试问整理谁先?而事实上,每次我整理这些东西,就像整理房间一样,总是没有特定目的然后就深陷进去最后总是重复。 所以我想,我必须明确一份工作程序和处理方案以后,并把内容分类然后再严格按照一种方式整理,这件事情才有完。 而这种处理方案必须做到暂时可以避免大多数时候的低效率重复。是的,这听起来就像暂时敲定一个程序接口一样。 所以这里,其实催生出一个新的事项:那就是 10.制定那么一份 清理工作的程序和处理方案; 11.关于 Contiki / FreeRTOS 我在想我在什么地方真正体会一下 任务机制 和 动态内存管理,我突然觉的暂时没必要瞎折腾,除非前面 3、4项我做出了眉目。 12.重新整理ST库 关于这个,我觉得,除非 第5点做好,否则我不考虑;而同时,我在做第九项时,如果不是特别复杂,我会首先把这些部分慢慢改过来。 总之,突然下大力气一次过把所有自己涉及过的外设(虽然也不多,大概四五个)都改过来,其付出的时间太多,而收效有效; 13.阅读Linux源码 这个,须知道,其实它和我在搞的Embeded Linux关系不大。我觉得这个至少要在看完 Code Reading 和那些和 Embeded Linux目前我想知道的 启动过程 等内容 之后才进行。 14.M2M/IOT 这个一看就是作孽的事情,先放下吧。 不过值得注意的是,我最近看到消息华为推出一个 Lite OS,我对它很感兴趣,因为从描述来看我认为它脱胎于FreeRTOS,而且它的规模和大小真正适合单片机这种有可能做成物联网数量级的应用。 除此以外,这种没意义的追问,我决定闭嘴。 当然这个月还有一些新的事情要添加进清单,但今晚就先到这里吧。
1149 次阅读|2 个评论
分享 转一个牛人的经验
lanjin 2015-6-13 22:02
这篇文章大学时就看过了,很激励我,我也因此才报了复旦的芯片设计专业,可惜挂了,这也是我的一个遗憾。现把该文章拿出来和大家分享下,下面是原文。 最近,应朋友之邀,写一点心得体会和大家共享。我记得本科刚毕业时,由于本人打算研究传感器的,后来阴差阳错进了复旦逸夫楼专用集成电路与系统国家重点实验室做研究生。现在想来这个实验室名字大有深意,只是当时惘然。电路和系统,看上去是两个概念,两个层次。我同学有读电子学与信息系统方向研究生的,那时候知道他们是“系统”的,而我们呢,是做模拟“电路”设计的,自然要偏向电路。而模拟芯片设计初学者对奇思淫巧的电路总是很崇拜,尤其是这个领域的最权威的杂志 JSSC ( IEEEJournalofsolidstatecircuits ),以前非常喜欢看,当时立志看完近二十年的文章,打通奇经八脉,总是憧憬啥时候咱也灌水一篇,那时候国内在此杂志发的文章凤毛麟角,就是在国外读博士,能够在上面发一篇也属优秀了国内最顶级的开发者论坛 ---- 读研时,我导师是 郑增钰教授 ,李联老师当时已经退休,逸夫楼邀请李老师每个礼拜过来指导。 郑老师治学严谨,女中豪杰。李老师在模拟电路方面属于国内先驱人物,现在在很多公司被请为专家或顾问。李老师在 87 年写的一本 ( 运算放大器设计 ); 即使现在看来也是经典之作。李老师和郑老师是同班同学,所以很要好,我自然相对于我同学能够幸运地得到李老师的指点。李老师和郑老师给我的培养方案是:先从运算放大器学起。所以我记得我刚开始从小电流源开始设计。那时候感觉设计就是靠仿真调整参数。但是我却永远记住了李老师语重心长的话:运放是基础,运放设计弄好了,其他的也就容易了。当时不大理解,我同学的课题都是 AD/DA ,锁相环等“高端”的东东,而李老师和郑老师却要我做“原始”的模块,我仅有的在 ( 固体电子学 ) (国内的垃圾杂志)发过的一篇论文就是轨到轨 (rail-to-rail) 放大器。做的过程中很郁闷,非常羡慕我同学的项目,但是感觉李老师和郑老师讲的总有他们道理,所以我就专门看 JSSC 运放方面的文章,基本上近 20 多年的全看了。当时以为很懂这个了,后来工作后才发现其实还没懂。所谓懂,是要真正融会贯通,否则塞在脑袋里的知识再多,也是死的。但是 运算放大器是模拟电路的基石 ,只有根基扎实方能枝繁叶茂,两位老师的良苦用心工作以后才明白。总的来说,在复旦,我感触最深的就是郑老师的严谨治学之风和李老师的这句话。硕士毕业,去找工作,当时有几个 offer 。我师兄孙立平,李老师的关门弟子,推荐我去新涛科技,他说里面有个常仲元,鲁汶天主教大学博士,很厉害。我听从师兄建议就去了。新涛当时已经被 IDT 以 8500 万美金收购了,成为国内第一家成功的芯片公司。面试我的是公司创始人之一的总经理 Howard.C.Yang (杨崇和)。 Howard 是 OregonStateUniversity 的博士,锁相环专家。面试时他当时要我画了一个两级放大器带 Miller 补偿的,我很熟练。他说你面有个零点,我很奇怪,从没听过,云里雾里,后来才知道这个是 Howard 在国际上首先提出来的,等效模型中有个电阻,他自己命名为杨氏电阻。当时出于礼貌,不断点头。不过他们还是很满意,反正就这样进了。我呢,面试的惟一的遗憾是没见到常仲元,大概他出差了中国电子顶级进入新涛后,下了决心准备术业有专攻。因为本科和研究生时喜欢物理,数学和哲学,花了些精力在这些上面。工作后就得真刀真枪的干了。每天上班仿真之余和下班后,就狂看英文原版书。第一本就是现在流行的 Razavi 的那本书。读了三遍。感觉大有收获。那时候在新涛,初生牛犊不怕虎,应该来说,我还是做得很出色的,因此得到常总的赏识,被他评价为公司内最有 potential 的人。偶尔常总会过来指点一把,别人很羡慕。其实我就记住了常总有次聊天时给我讲的心得,他大意是说做模拟电路设计有三个境界:第一是会手算,意思是说 pensile-to-paper ,电路其实应该手算的,仿真只是证明手算的结果。第二是,算后要思考,把电路变成一个直观的东西。第三就是创造电路。我大体上按照这三部曲进行的。 Razavi 的那本书后面的习题我仔细算了。 公司的项目中,我也力图首先以手算为主,放大器的那些参数,都是首先计算再和仿真结果对比。久而久之,我手计算的能力大大提高,一些小信号分析计算,感觉非常顺手。这里讲一个小插曲,有一次在一个项目中,一个保护回路 AC 仿真总不稳定,调来调去,总不行,这儿加电容,那儿加电阻,试了几下都不行,就找常总了。因为这个回路很大,所以感觉是瞎子摸象。常总一过来三下五除二就摆平了,他仔细看了,然后就导出一个公式,找出了主极点和带宽表达式。通过这件事,我对常总佩服得五体投地,同时也知道直观的威力。所以后来看书时,都会仔细推导书中的公式,然后再直观思考信号流,不直观不罢手。一年多下来,对放大器终于能够透彻理解了,感觉学通了,通之后发现一通百通。最后总结 :放大器有两个难点,一个是频率响应,一个是反馈。 其实所谓电路直观,就是用从反馈的角度来思考电路。每次分析了一些书上或者 JSSC 上的“怪异”电路后,都会感叹:反馈呀,反馈!然后把分析的心得写在 paper 上面。学通一个领域后再学其他相关领域会有某种“加速”作用。常总的方式是每次做一个新项目时,让下面人先研究研究。我在离开新涛前,做了一个锁相环。我以前没做过,然后就把我同学的硕士论文,以及书和很多 paper 弄来研究,研究了一个半月,常总过来问我:锁相环的 3dB 带宽弄懂了吧?我笑答:早就弄懂了。我强大的运放的频率响应知识用在锁相环上,小菜了。我这时已经去研究高深的相位噪声和 jitter 了。 之后不久,一份 30 多页的英文研究报告发出来,常总大加赞赏!。后来在 COMMIT 时,有个项目是修改一个 RFTransceiver 芯片,使之从 WCDMA 到 TD-SCDMA 。里面有个基带模拟滤波器。我以前从没接触过滤波器,就花了两个月时间,看了三本英文原版书,第一本有 900 多页,和 N 多 paper ,一下子对整个滤波器领域,开关电容的, GmC 的, ActiveRC 的都懂了。提出修改方案时,由于我运放根基扎实,看文章时对于滤波器信号流很容易懂,所以很短时间就能一个人提出芯片电路原理分析和修改方案。最后报告写出来(也是我的又一个得意之作),送给 TI.TI 那边对这边一下子肃然起敬, Conferencecall 时,他们首先说这份报告是“ Greatjob! ”,我英文没听懂, Julian 对我夸大拇指,说“他们对你评价很高呢”。后来去 Dallas , TI 那边对我们很尊敬,我做报告时,很多人来听。总之,现在知道,凡事情,基础很重要,基础扎实学其他的很容易切入,并且越学越快。我是 02 年 11 月去的 COMMIT ,当时面试我的也是我现在公司老板 Julian 。 Julian 问我:你觉得 SOC(systemonchip) 设计的环节在哪儿?我说:应该是模拟电路吧,这个比较难一些。 Julian 说错了,是系统。我当时很不以为然,觉得模拟电路工程师应该花精力在分析和设计电路上。 Julian 后来自己 run 了现在这公司 On-Bright ,把我也带来,同时也从 TI 拉了两个,有一个是方博士。我呢,给 Julian 推荐了朱博士。 这一两年,我和朱博士对方博士佩服得五体投地。方博士是 TI 华人里面的顶级高手,做产品能力超强。 On-Bright 现在做电源芯片,我和朱博士做了近两年,知道了系统的重要性。芯片设计最终一定要走向系统,这个是芯片设计的第四重境界。电路如同砖瓦,系统如同大厦。芯片设计工程师一定要从系统角度考虑问题,否则就是只见树木,不见森林。电源芯片中,放大器,比较器都是最最普通的,其难点在于对系统的透彻理解。在 On-Bright ,我真正见识了做产品,从定义到设计,再到 debug ,芯片测试和系统测试,最后到 RTP(releasetoproduction) 。 Julian 把 TI 的先进产品开发流程和项目管理方式引入 On-Bright ,我和朱博士算是大开眼界,也知道了做产品的艰辛。 asi 。产品和学术是两片天地,学术可以天马行空,做出一个样品就 OK 了。产品开发是一个系统工程,牵涉到方方面面的工作, N 多的人一起协作,最终才能使产品成功推向市场。芯片领域,我以前非常崇拜学术界牛人,现在发现工业界水平还是较学术界领先,朱博士说他以前在瑞士理工黄秋亭 (IEEE 的著名 Fellow) 那儿做过半年研究,当时很崇拜黄,现在发现方博士水平更高。所以就像 ( 天龙八部 ) 中,一个无名扫地老僧是顶级高手。但无论工业界还是学术界,这四重境界却是共同的,每个模拟芯片设计者都应该一步一步脚踏实地,逐次跨越这四重境界。 嘿嘿 , 自己总结下前辈的心得 : 第一是会手算,意思是说 pensile-to-paper ,电路其实应该手算的,仿真只是证明手算的结果。第二是,算后要思考,把电路变成一个直观的东西。第三就是创造电路。芯片设计最终一定要走向系统,这个是芯片设计的第四重境界。
567 次阅读|0 个评论
分享 在内嵌RAM中运行程序(转)
wateras1 2015-1-8 17:36
这两天开始捣鼓板载STM32F103ZE的红牛开发板,每次做一点小改动都要重新下载程序到Flash中,很慢不说,还担心这么频繁地刷,Flash啥时候突然就归西了。于是准备每次下载程序的时候写到片载的RAM中。参考了网上的一些文章,发现不同的人说法略有差异。走了很多弯路以后,终于成功地下载到片载RAM中并运行起来。因为是刚刚上手STM32,就按初学的视角总结一下设置的经过,不涉及内部的机制。下面的步骤基本上都是必须的,应该没有迷信的步骤在里面了。 一、 先创建一个新项目。 1. 菜单 P roject -- New m V ision Project 。创建名为 RAM 的项目,并选择 CPU 为 STM32F103ZE 。添加启动代码选“ Y ”。 2. 这时,项目中仅有 STM32F10x.s 启动代码,要自己创建一个包含 main.c 的主文件。菜单 File -- New ,创建一个新文件,填入 main() 函数,保存为 main.c 。内容可以简单到极致: int main() { while(1); } 3. 右键单击 Source Group 1 ,选“ Add File to "Source Group 1" ”,添加 main.c 文件。至此一个新项目已经建立完毕,可以编译并在虚拟器中运行了。 二、 新建一个名为 SRAM.ini 的文件。内容如下: FUNC void Setup (void) { SP = _RDWORD(0x20000000); // Setup Stack Pointer PC = _RDWORD(0x20000004); // Setup Program Counter _WDWORD(0xE000ED08, 0x20000000); // Setup Vector Table Offset Register } LOAD RAM.axf INCREMENTAL // Download ,红色代表工程文件名 .axf Setup(); // Setup for Running g, main 三、 设置项目的参数。在工具条上点击“ Options for Target ”,弹出项目设置对话框。 四、 在对话框的 Target 标签,修改 IROM1 地址。 Cortex-M3 的内部 RAM 的起始地址是 0x20000000 , STM32F103ZE 的 RAM 总共有 64k 。这里把 48k 分给 ROM , 16k 分给 RAM ,设置如下图。 注意, IROM 原先的地址是 0x8000000 ,后面是 6 个 0 ,而需要填入的新地址是 0x20000000 ,后面拖的是 7 个 0 ,千万不要填错。 五、 切换到 Linker 标签,修改基地址。 一开始,此标签下的 R/O Base 和 R/W Base 内容是不允许修改的,如下图 勾销“ Use Memory Layout from Target Dialog ”之后才可以编辑。在 R/O Base 填入 0x20000000 ,在 R/W Base 填入 0x2000C000 ,然后在勾选 “ Use Memory Layout from Target Dialog ”。完成后如下图。 六、 接下来是 Debug 标签设置。 1. 首先去掉“ Load Application at Startup ”核选框,并在下面填入刚才建立的 SRAM.ini 文件。 2. 选择 Cortex-M3 J-Link 调试器。如下图。 再点击旁边的 Setting 按钮,设置 JLink 设备。在弹出对话框中选择“ Falsh download ”标签。 (1) 核选“ Do not Erase ”,即在下载之前不需要擦除存储器; (2) 在“ RAM for Algorithm ”区的 Start 栏填入 0x2000C000 ,与前面的 RAM 设置保持一致。这里的 RAM 空间是供烧录时用的,大小用默认的就可以,不用改。 (3) 点击对话框最下面的 Add 按钮,在弹出对话框中选择“ STM32F10X High-density Flash ”,并点击确定,与 STM32F103ZE CPU 保持一致。 (4) 在“ Programming Algorithm ”的 Start 和 Size 中,一如既往地填入 0x20000000 和 0xC000 。指定烧录过程的起始位置和范围。按确定回到“ Options for Target ”对话框。 七、 选择“ Utilities ”标签栏,在“ Use Target Driver for Flash Programming ”下面选择“ Cortex-M3 J-Link ”。 旁边的 Setting 按钮和刚才设置的是同一个对话框。 八、 至此,设置全部完成。可以下载到板上运行了。 九、 常见错误: 1. 最常见的错误是在下载程序到芯片(烧写芯片)时,跳出一个对话框,显示“ Flash Timeout. Reset the Target and try it again. ”。通常这并不是由超时引起的错误,而是地址设置有误,程序写不进芯片中。有时在步骤六设置的 Flash Download 地址会丢失,发生这种错误时,先检查各个地址设置是否正确。 2. 如果在烧写芯片时弹出对话框显示“ Error: Flash Download failed - "Cortex-M3" ”,并且在 Output Window 的 Build 窗口中显示“ No Algorithm found for: 02000000H - 02000233H ”,这是步骤四的 IROM1 里填写的地址有误, 0x20000000 应该有 7 个 0 ,少填了个 0 就报这个错误。这个要特别小心,因为初始值 0x8000000 后面拖的是 6 个 0 。
个人分类: STM32F4XX/1XX/2XX/3XX/stm8s|729 次阅读|0 个评论
分享 相关函数 数字信号处理
zxb3558493 2014-12-23 15:10
一、相关函数在数字信号处理中的应用(引用文章--- 相关函数在数字信号处理中的应用 ) 1、隐含周期性检测中的应用 2、确定未知参数的线性系统的频率响应的应用 3、噪声中信号检测的应用 4、噪声信号提取中的应用
个人分类: 数字信号处理|1 次阅读|0 个评论
分享 Frist
热度 1 zhongchuangjie 2014-11-26 16:39
看了那么多,还是决定用这个吧,至少能够不显示不方便显示的文章。
个人分类: 笔记|432 次阅读|1 个评论
分享 写你所想——飞凌掷千元现金大奖等你来赢!
jameswangsynnex 2014-9-24 17:40
写你所想——飞凌掷千元现金大奖等你来赢!
飞凌嵌入式基于Cortex A8 AM335x平台发行的OK335X系列开发平台自上市以来一直受到各界嵌入式爱好者的亲睐和关注,为了回馈广大飞凌用户,现展开大型征文活动,只要您持 有飞凌AM335x系列开发平台中任何一款开发板,都可以加入到我们的活动中来,在这里,只要您愿意,就可以写您所想,报名参与活动将您的使用心得及评测文章发布到任何电子 类论坛平台,就有机会获得千元现金大奖! 微博报名时间:2014年9月23日开始 征文发布开始时间:2014年9月23日--2014年10月17日 评选时间:2014年10月18日—24日 获奖公布时间:所有获奖者将于2014年 10月31日在飞凌嵌入式的官方微博公布。 报名方式:关注飞凌嵌入式官方微博(新浪微博),私信将个人姓名、职业、联系方式、邮箱、发布平台地址、发布ID发送给我们,收到回复即是报名成功; 内容要求: 标题:文章标题请加注【飞凌嵌入式】,未加注者不计入活动范围 内容:围绕使用AM335X系列开发平台OK335xD、OK335xS-II、OK335xS开发平台展开,所写的技术型文章(如:方案型文章、评测文章或者连载类使用心得等),文中需包含飞凌嵌 入式、AM335X、OK335xD、OK335xS-II、OK335xS等关键词。 活动规则: 1.活动仅限以使用飞凌嵌入式AM335X系列开发平台为基础所做的技术型文章; 2.技术型文章发布渠道可任选,但需在各大电子媒体连续活跃7天,即:评论、回帖、互动等; 3.文章总字数要求在1000字以上,内容真实,不得抄袭; 4.图文形式的技术型文章可酌情加分; 5.方案形式的技术型文章可酌情加分; 6.获奖者名单将于活动结束后在新浪飞凌官方微博公布; 7.如果发布违法言论,发布抄袭文章,刷回复刷关注,一经发现取消参加活动资格。 8.本次活动的一切解释权归飞凌嵌入式所有,飞凌嵌入式有权对活动章程进行更改。 9. 免责声明:所有参赛文章和图片著作权归作者本人,但对于提交给活动的文章和照片,活动主办方视为已授权。 评审标准: 本次活动主要根据活动后文章的人气度为主,飞凌嵌入式评委的综合评价为辅,同时结合资深网友的意见进行评选。 参考内容包括:活动文章的精彩性、原创性、实用性、内容完整性、更新频率、文章点击数、回复数和评委、资深网友的综合意见。 评委: 飞凌资深工程师 评分细则: 阅读得分 = 参赛文章有效阅读次数10次*1 活跃得分 = 活跃天数*50 评论得分 = 参赛文章有效评论数*10 飞凌评分 = 根据博文内容质量,评0-2000分 活动总分=阅读得分 + 活跃得分 + 评论得分 + 飞凌评分 飞凌评分标准:内容精彩性(0-500分);内容价值(0-500分);内容原创性(0-500分); 内容完整性(0-500) 获奖结果以总评分为依据,得分越高,排名越高。第一名为一等奖,以此类推评出各个奖项的获奖作者。 奖品设置: 一等奖1名,奖1000元; 二等奖2名,奖500元; 三等奖3名,奖100元 四等奖5名,奖50元 参与奖20名:奖10元话费充值
个人分类: 代理商活动|1066 次阅读|0 个评论
分享 linux移植的好文章
ljm_bj 2014-7-29 10:13
链接: http://blog.chinaunix.net/uid-28382924-id-3479276.html
个人分类: 软件相关|211 次阅读|0 个评论
分享 关于导线中的电子移动速度和导线两端电压关系
lanjin 2014-4-23 10:18
这个标题是我看到电容充电曲线后的一个疑问,就是电容为什么刚开始充电很快,后面充电越来越慢,我相信这个问题也是很多人想搞明白的,这篇文章我是转载的,不是我本人写的,我目前也没能力写出这样的文章,所以哪位网友转的时候最好表明是转的。 导线中电流运动的物理量的关系 导线中运动的电流和建立在导线两端的电压的关系在传统的物理学中并没有详细的探讨,但在解释导线中通电电流产生一定的热量的对焦耳公式的解释中,由于此相关的推倒。常规认为,通电导线中的电流所产生的热量,是由导线中的自由电子在电场的加速下对导线中原子的碰撞引起,这样计算的方法电流产生的热量依赖于电子和导线原子发生碰撞时的速度决定,即:电子和导线中原子碰撞的动能决定。这样,我们根据如下的简单关系: 通电导线产生的热量W=Uit 一个电子碰撞时的动能为(1/2)mv 2 ,如果有n个电子,则电子的动能完全转化为热能时产生的热能为n(1/2)mv 2 如果通电时间和电流的大小不变,据此,那么我们可以得到导线两端的电压与电子运动速度的平方成正比。(其中电子的运动速度是指电子和导线中原子碰撞时的平均速度) 另一方面,导线中的电流是由导线中电子的运动决定的。通电导线中的电流会在它周围的空间中产生磁场,经验事实说明,通电导线在它周围空间中的磁场只于电流的大小有关,与电压无关。 此外还有如下的关系:运动的电荷在它周围产生的磁场与电荷的运动速度成正比。 电容的公式:电容存储的电量与电容量极板两端的电压成正比。此说明导体中电荷密度和导体两端电压的关系。 如上各个关系间存在矛盾。主要反映在导体两端的电压与导体中自由电子运动速度的关系。我们可以通过多种方式进行调谐。但不外乎如下两个角度: 导线中运动的自由电子所产生的磁场是否遵守孤立电荷在空间中运动所产生磁场的规律。对此我们找不出任何的理由来否定这样的结果。这一点我们是不用怀疑的。 第二点就是确定电子在导线中的运动规律,即:电子以什么样的方式在导线中运动。也就是电子的运动速度和电压的关系。   在 导线中电流的运动速度和导体电压的关系 中未能说明的一个问题 在 导线中电流的运动速度和导体电压的关系 中有一个问题未能说明,如图: 图中表示一个导体的一部分,上图是在较高的电位下导体中电荷的分布状态,下图是较低的电位下导体中电荷的分布状态。假设图中的小圆球表示电子,导体两端有电压存在时,导体中的电路沿箭头的方向运动。 但导体传导一个电子时,电子从导体的一端运动到另一端,在上图中,电子需要传导四次,但下图电子只要传导两次,如果电子的运动速度是相同的,那么,传导一个电子,两种理论会存在两种结果。 首先是传统的物理学中的看法,将导体中电子的运动归于导体两端的电场,那么,图中当电子传递时,导体中所有的电子同时运动,如果传导一个电子,那么可以看成图中一行电子同时运动完成一个电子的传递。在导体中不同的电荷密度下(如建立在导体两端的电压不同,所形成的移动的电荷密度也就不同),同样传导一个电荷,同时运动的电荷数量是不同的。依据传统物理学中的的看法,当导体中瞬时传递一个单位电荷的时候,导线产生的瞬时的磁场强度是不同的。如果依据电容的电量与电压的关系,(即:导线两端的电压与导线中的电荷密度成正比。稍后有简单的证明方法)则,传导一个单位的电荷,如果传递速度是相同的,则导线所产生的瞬时磁场强度与导体中移动的电荷密度成正比。 导线两端的电压与导线中的电荷密度成正比, 这一关系可有如下简单证明,如图: 图中是具有一定电阻的一导体AB,当在A端和B端建立一个电势差后,导体AB会存在电流流动。其中小白球代表正电荷,小黑球代表负电荷,在某种意义上来说,这就是电位。如果我们从零电位处为正负电位分界点,那么,图中的正电荷或负电荷的数量与建立在AB两端的电位差成正比,即:导线中的电荷与建立在AB两端的电压成正比。(这里需要说明一下的是图中所标出的电荷并不是导线中移动的电子,只是电荷在导线中的一种分布状态) 如果导体AB存在电流的流动,那么使导线中的电荷发生定向移动的是如图中ACDEFB等处的电荷密度的不同所引起。这取决于一个电荷在导体中的任意位置所受到作用力的大小。如果导体中的电阻是均匀的,并且建立在导体AB端的电压是稳定的,那么,导体中任一点电荷所受到的作用力是相等的。即:电荷从A移动到B或者电子从B移动到A。 如果导体中的电荷的移动是由于导体两端的电场同时给导体中所有的电荷加速,即:导体中的电流的运动速度已光的速度传递、电场的速度,那么必然同时的分如下几个部分同时进行:电荷从A移动到C、电荷从C移动到D、电荷从D移动到F、电荷从F移动到B。如果导线中的电荷密度通电压成正比,那么,导线中电荷在发生定向移动时, (如果导线只传递一个电子)导线中同时传递的一个电荷的数量同导线两端的电压成正比。这样传递一个电子,如果电子在导线中的运动速度与导体两端的电压无关,在距导线外较远处一点产生的磁场强度同电压成正比。看到这点,您请勿忘了,这样判断的结果是导线只是传递一个电子。 如果导线中电荷的移动速度同导体两端的电压成正比,这样我们就不能得出和经验事实相符的结果。 依据力学的分析,将导线中电荷的移动归因于导线中电子的不同分布所形成的电荷密度差异。当我们给导线两端建立一个电压时,导线两端形成如图中所述的导体中的电荷分布状态。由于导线中自由电子在不均匀的电荷密度分布状态中所受到的作用力,会使电子沿一个方向运动,这样就形成电流。使电流流动的原因这样就不是电场了,而是导线中的电荷密度差异。 (导线中电荷的运动速度和电压的关系仅凭如上这些还不能进行判定,这是因为导线中的电流确定的情况下,电子运动速度和瞬时电流的关系。在电流确定的情况下,导线中的电子的运动速度越高,导线中的瞬时电流越小) 这样的处理方法虽然和传统物理学中存在本质上的不同,但是对导体中电荷的定向移动所给与的解释,电位差和电荷密度差异两种概念两者具有等效性。关于导线中电荷的传递稍候我们在做分析。 如下的判断就要归于电磁感应现象了。 来自电磁感应现象的问题 关于电子的运动速度,说明这一现象的还有电磁感应现象。 当带电体在空间中运动时,会在它周围的空间中产生磁场,并且产生的磁场强度和带电体的运动速度成正比,这是经验事实。实际上,传统物理学中的一种看法是将电荷的运动作为常规磁场的一种主要来源。我们找不到磁场来源更好的方法,或者寻求接近磁场本身来源更为合适的解释,当然,这并不是唯一的,对磁场的解释还有一种磁荷的解释,在磁学中,这两种方法是等效的。但是我相信,大自然中的磁场只有一种,最合理的解释也只有一种,只是我们还没有发现而已。 利用运动的电荷产生磁场,并且确定电荷产生的磁场与电荷的运动速度成正比的经验事实,也可以成为判断导体中电荷的运动速度的一种参考。这样说法只是电子在导体中的运动状态和电子在空间中的运动状态是不同的,电子在导体中的环境是存在电场,原子尺度中的电场我们不能去精细的作任何尝试,只能根据常规的理论去判断电子和原子的相互作用的可能性的尝试,但有一点毫无疑问,电子在原子中的运动受到原子中各个电荷的强烈的相互作用。依据电子的两种运动环境去判断电子的运动速度只能作为一种参考吧。 一根导线,它所产生的磁场强度与通过它本身的电流的大小成正比,这是经验事实。或者换句话说,导体中运动的电流所产生的磁场强度与建立在它两端的电压无关。 电磁感应现象的另一个事实是给导线中通一瞬间的电流,则在导线外的空间中产生一个瞬时的磁场,如果在空间中还存在某一导体,那么,在和原导线平行的方向,会产生某一感应电流。如果导线只是一段,则在导线两端产生瞬时的电势差。即:类似于上图中的电荷分布。 经验事实说明,感生电流只与空间中变化的磁场有关,产生空间中变化磁场的是由于另一个导线中的电流引起。因此,通过感生电流去判断导线中的电子的运动速度,这样就提供了一种可能性,尤其是可以解决瞬时电流和电流间与分子运动速度的关系。 我们首先考察一段具有一定电阻的导体在不同电压下通过确定的电流时对外产生磁场的情况。 假设有两端完全相同的具有一定阻值的导体,如果给其中一个导体通以一个单位的电压,给另一端导体通一两倍的电压,那么可以判定,两个导体中的的电流强度与他们自身的电压成正比。在单位时间里,一个导体的电流所做的功是另一个导体的4倍。但是,两个导体所产生的磁场,电压高的导体是电压低的导体的两倍。 如果导体产生的磁场是由导体中定向移动的自由电子引起,并且与导体中自由电子的平均移动速度成正比。那么,依据如上的关系,不能判定电流产生的磁场与自由电子的移动速度的关系。 依据电流产生磁场的特点,电流产生的磁场是由导线中瞬时运动的电子所产生的。磁场的大小只依赖于导线中同时运动的电子。不是单位时间里电流的大小。实际上, 在电流稳定的情况下,单位电流与这一导线中瞬时定向移动的电子产生的磁场成正比 。这一点,课本中也是没有指明的。 在如上的两段导体中不论建立在导体两端的电压如何变化,导线中的电流所产生的磁场强度只与导线中的电流强度成正比。这是经验事实。 但是,如果涉及到电子在导体中的移动速度,如果导体中电子的移动速度与导体两端的电压成正比,那么,如上的物理关系仍然成立。比如如上两段导体:如果建立在导体上的条件不变(这样的假设是存在问题的,因为建立在导体两端的电压发生变化,那么,导线中的电流必然要发生变化),那么电压高的导体中的电子的运动速度如果比电压低的导体中的电子的移动速度大一倍,那么单位时间内电压高的导体通过的电子比电压低的导体大一倍。但是,由于电压高的导体的电子的运动速度提高一倍,瞬时在导体中运动的电子在两个导体中就是相同的了,但是由于运动的电荷产生的磁场强度同电荷的运动速度成正比,那么,仍然可以得到电压高的导体的电流产生的磁场强度比电压低的导体产生的磁场强度大一倍。但是,这样得出的结论和传统物理学中的物理关系就不同了,这样将和传统物理学中的电子的动能和电子的运动速度的关系发生矛盾。 我们知道,电容的公式是电容存储的电量与电容两极板的电压成正比,那么我们没有理由认为在导体中的某一位置的两端电荷密度不同时,同时运动的仍然会是相同的电子数量。另一方面,来自传统能量定义中电子的动能定义。是看作产生焦耳热的一种方法,电子的动能同电子的运动速度成正比。(考虑到三维的空间中,仍然成立)这样的关系不能解释电流运动所产生的动能,也不能解释电子运动产生的磁场与导体两端的电压与电流的关系。 我个人认为,导体两端的电压与导体中电子的运动速度是无关的对于处理物理问题是方便的。此外,对这一关系的另一方面的支持来自于超导现象,后面,我将要探讨这个问题。 在关于电流的问题即将结束的时候,我们再回顾一下导线对电流传导的结论 导体在传递电流的开始,即导线接通电压的一刻,导线中使电流运动的电荷密度差异的建立,分两个方向进行,一个方向是从导线的正极开始,其特点是从导线获得电子,是导线的电子的密度减小。另一个方向是从导线的负极开始,其特点是给导线增加电子,使导线中电子的密度增大。当导线中电和状态如上图中所示,建立稳定的分布状态的时候,即恒稳电流。 电子从导体的负极不断的注入到导线,并通过导线,从正极导出。 从导体电源接通的一刹那,导线中电荷的电荷发生流动电子是由负极流向正极,分两个方向同时进行,但一但导线中建立了稳定的电荷密度差异的时候,导线中电子的传导将不在是逐渐的过程 ,即逐渐从导体的B端移到导体的A端,这时传导时间不能再采用速度进行计算,但是产生一个电流信号的过程仍需要时间,表现为导体中电荷密度的重新分配,即电源刚接通一刹那的过程。这是需要时间的,由于电子具有质量,电流的信号要略小于光速在导线中传播。 其中在导线传递电流的过程中,电子的移动速度为近似常熟。 探讨电流在导线中的移动速度是没有意义的,这是因为导线两端的电极,一端得到电子,另一端失去电子,如同我们探讨一条河的源头和流入大海一样,河的末端流出河的源头流入。只有探讨水流的速度,才有意义。 如上是对导线传递电流的总结吧,由于我采用通俗语言的方法进行描述,难免存在未能说明的地方,故将结论写到这里。 导线中存在电流时自由电子的存在状态和原子间的相互作用方式 对于导线中自由电子和原子之间的相互作用,常规的判断方法将自由电子和导线原子之间发生的相互作用归于碰撞。这样的解释方法是存在很多的疑问的。首先是根据传统的物理方法所建立的传统物理量间的关系。如:本文开始所列出的几种关系。 我在 导线中电流的运动速度和导体电压的关系 中,处理电流在导体中的运动不是采用电场的方法作为使电流在导体中移动的直接的原因。而是电子之间的相互作用力作为电子在导体中运动的根本原因。这样处理的方式和传统的处理方法是不同的,首先这样处理的方法电流在导线中的传递速度不会是电磁波的传递速度——光速。它要略小于光速。因为电子的质量非常微小,但还是有质量的。惯性是使电流不能达到光速的原因之一,另一点就是导体的内部结构了,电阻的存在也是使电流不能达到光速的原因之一。稍后我们将详细的讨论这个问题。 另一点值得注意的是导体中的电流的存在和电容中存在的电荷是不同的,在导体两端的电压较低时,电流在导线中的运动对导线外不显电性,电性只反映在导体中原子间瞬时的状态上,这样对于导线来说,就产生热量。通电导线产生热量的模式是通过电子在原子附近通过时给与原子的相互作用。 电子的惯性对原子的相互作用是很微小的,我们知道,带电粒子在线度比小于十的三次方时,电荷间的极化强度是很高的,带电体间的相互作用也非常大。电子的质量很小,这样,电子的惯性可以略而不计,其次,由于原子中都是由带电粒子组成——即:原子核和电子。电子不会加速的很高的速度,这一点对于电子的惯性来说,也可以说略而不计了。因此,将电子在导体中运动时给于导体中原子的作用主要是由带电粒子间的相互作用决定是合适的。 导体中的电阻 关于这个问题,我个人认为必须将它放于电子和导体原子间结构的相互作用上。 如图:图中的竖线表示表示电子的运动轨迹,竖线下方的小黑点表示两个正在传导中的电子。这张图只是简单说明电子和导线中原子相互作用的简图,并不表示导线中的原子中的电子真的是这样的分布。 由于导线中电荷密度差异的作用下,电子被其它电子的相互作用的推动下,从 AB两 原子间通过时,会对AB两原子产生相互作用,迫使两原子存在状态发生变化。我们可以通过如下方面来考察: 1、电子在原子的旁边通过时,会给于原子中的带电体相互作用,并瞬时改变原子的存在状态。会存在如下两种存在状态的改变:一、原子核外层的电子在原子空间中的分布发生变化。二、原子核也会受到作用力并存在位移的变化。根据牛顿第三运动定律,作用力的大小相等,方向相反,电子改变导体中原子的存在状态的同时,也会受到反作用力。但是这里需要说明一下的是,导体中的自由电子和原子核外的电子在物质的属性上没有区别,在传递过程中,它也是原子中电子的一员。 2、导体中原子的存在环境:我们知道,在确定的温度下,物体中的原子都在不停的运动,在机械运动中,曾从机械运动的角度探讨过原子的运动速度和温度的关系,两者成正比。那么,如上的图中所画出的原子的状态只能是从方法论的角度而确定的空间位置,不是原子的实际的空间位置。另一方面,原子在不停的运动,我们从静止状态得出的结论,不是物理事件的真实。 3、导体的结构。 我们知道,导线存在的环境都有确定的温度,对于导线,确定的温度存在确定的原子的震动状态。在机械运动的能量体系中,根据弹性碰撞的规律,如果两个物体之间接触并不发生热量的传递,那么两个物体相互接触的原子的平均震动动量必然相等。得到物体的温度同物质震动的原子的平均动量成正比。那么,一定的温度对应着物体原子的确定震动状态。 普通的导体是金属,我们知道,金属具有可塑性,并且在化学原子的结构中,金属的最外层电子数小于4,金属原子与金属原子之间,不能构成稳定的价键结构。如图: 图中一个圆球表示一个原子,图中的小黑点表示原子间稳定的结合点,类似于传统化学中的稳定的离子形的价键结构。这里稍谈一点化学的看法。我个人认为,传统中对物质原子的结构不是符合力学的原则的,也许这就是量子论的描述吧。 我的原因很简单,传统的化学物质尤其是具有稳定的价键结构的物质,一般都是绝缘体。从力学的角度上来看,这是根本行不通的。这是因为如图:在这个二维的平面图中,在四个相邻的原子之间又一个近似菱形的空白,如果晶体的剖面真如这个二位图 中所示,在晶体中,原子在空间中的位置存在稳定的排步规则。在这个近似菱形的中心,电子所受到的物体原子中的作用力最小,那么,如果给晶体加一电压,该晶体中的原子如果是排布规则的,那么,电子会在电极上电场的作用下,从近似菱形的中心通过,形成导体。也就是说,经验事实中不导电的晶体,理论上应该导电才对。   止于2000.6.24   关于本文的说明 本文试图通过从机械运动的角度对导体传导电流进行定性分析,寻找到电子在导体中运动的特点,其目的是对超导做出普遍性的解释。 虽然可以建立超导普遍解释的模式,但是,在语言表达上存在一定的困难,尤其是系统的逻辑论证上。 遵循如下几点,我认为可以对超导在机械运动中 进行普遍的解释。 1、超导的温度:超导通常发生在极低的温度下,这种状态下导体原子的震动速度很慢。这说明超导发生在原子相对静态的环境中 。 金属导体的电阻同导体的温度存在确定的关系,表现为随温度的升高而线性增加。 2、电子和原子间的相互作用。在超导状态下,可以认为电子在导体原子中通过时可以认为给与原子的作用可以忽略不计。或者换句话说,在超导条件许可的情况下,如电流的大小,外加磁场等,和原子的相互作用不会改变原子的存在状态。或者说,是一种相互作用力的平衡状态。 3、电子和原子普遍的相互作用特点:关于这一点,我还未曾在本站中的文章中作证明。但是,根据牛顿运动定律,这是必然的。这一特点是 原子中电子和原子核间的相互作用,趋向于相互作用间的平衡状态 。实际上,相互作用的物体都具有这样的特点。导体或者物质间的微观相互作用,都在这一特点之列。 在如上三点的基础上,我认为可以对超导现象在微观物质的相互作用的基础上可以做出合理的解释。
888 次阅读|0 个评论
分享 新年新日志
热度 1 sjl2001 2014-1-1 23:22
新年的第一天和家人一起度过,很开心。 回想这过去的2013,感慨很多,从年初的彷徨迷茫到年中的幸福来敲门再到年末的幸福快乐。我的2013收获颇丰。 年初,由于学业上的原因,我彷徨了很久,徘徊在硬件和算法的迷宫中无法自拔,做硬件无法给毕业足够的支撑,做算法又没有太多的积累,无奈想到过退出,离开3年前心驰神往的HIT,后来这个念头被7月份的一份迟到的录用通知打破。虽然不是什么大牛期刊,但也充分证明了我工作的意义,我不是废柴。这期间还要感谢一直陪伴我的朋友,他的一句话点醒了我,让我有了重新拾起信心的勇气。在接下来的时间里,我开始了我的实验生活,每天至少一次的排队实验,每天收获新的数据和新的信心。2个月的时间结果如预期所想的。心里也有了底。随后有些小懈怠,没有坚持把文章写出来。 8月份,是我的幸福开始的时候,这个月我邂逅了我的她,没想到我们一见面就那么的投缘,相处下来到现在也快4个月了,中间有过小摩擦也都顺利解决了。我的文章也逐渐有了模样。更让我开心的事,我把我的整体规划列成目录给老板看,得到了期盼已久的赏识。也更加坚定了我继续做下去的信心和毕业的决心。 这一年我迷上了海淘,给家人买了nb总统慢跑鞋,给自己买了levis501,给她买了施华洛世奇项链,帮朋友买婴儿用品…………价格便宜,但是也快着迷了,耽误事儿,干完这一单就不做了,太费神了。 这一年陪伴EEworld的时间由于上面这些的原因少了很多,但还是用多年积累的RP收获了向往已有的温控焊台,搭建了自己的小作坊,就差示波器了呵呵。下次有团购示波器的时候别忘了我啊。 2013我没有虚度,给自己一个交代也给爱我的人一个交代。2014,期待。
个人分类: 总结|2 次阅读|2 个评论

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-14 10:09 , Processed in 0.079392 second(s), 19 queries , Gzip On, MemCache On.

Powered by EEWORLD电子工程世界

© 2019 http://bbs.eeworld.com.cn/

返回顶部