存档

‘工作’ 分类的存档

关于GPS的精度问题

2014年6月26日 没有评论

GPS在刚开始定位成功时,偏差很大,过一段时间,会慢慢较准。我一直的理解是刚开始参与定位的卫星少,后来多了以后才更精准的。

偶然发现有别的因素。

1、先列官方最简单直接的说明,Selective Availability,摘录如下:http://www.gps.gov/systems/gps/modernization/sa/

Selective Availability

chart GPS accuracy errors before and after deactivation of SA (VIEW MORE DATA)
Selective Availability (SA) was an intentional degradation of public GPS signals implemented for national security reasons.

In May 2000, at the direction of President Bill Clinton, the U.S government discontinued its use of Selective Availability in order to make GPS more responsive to civil and commercial users worldwide.

The United States has no intent to ever use Selective Availability again.
In September 2007, the U.S. government announced its decision to procure the future generation of GPS satellites, known as GPS III, without the SA feature. Doing this will make the policy decision of 2000 permanent and eliminate a source of uncertainty in GPS performance that had been of concern to civil GPS users worldwide.

更多内容…

分类: 工作 标签: , , , ,

修养第3章小结

2014年6月25日 没有评论

1、有一处错误。59页第三行:

所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已。

并且配了图,全局的未初始化变量int global_uninit_var;用点虚线连到.bss section

实测结果发现是错的。
只有静态的未初始化变量会预留位置。非静态的全局变量不会预留。

测试代码bss.c

int a;
int main(){
        return 0;
}

头信息显示,.bss的Size为0

bss.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         0000000b  0000000000000000  0000000000000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  0000000000000000  0000000000000000  0000004c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000000  0000000000000000  0000000000000000  0000004c  2**2
                  ALLOC
  3 .comment      0000002d  0000000000000000  0000000000000000  0000004c  2**0
                  CONTENTS, READONLY
  4 .note.GNU-stack 00000000  0000000000000000  0000000000000000  00000079  2**0
                  CONTENTS, READONLY
  5 .eh_frame     00000038  0000000000000000  0000000000000000  00000080  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

把全局变量改为全局静态变量时,才会到.bss段

static int a;
int main(){
        return 0;
}

头信息显示,.bss的Size为4,一个int的大小,四个字节。

bss.o:     file format elf64-x86-64

Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         0000000b  0000000000000000  0000000000000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000000  0000000000000000  0000000000000000  0000004c  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  2 .bss          00000004  0000000000000000  0000000000000000  0000004c  2**2
                  ALLOC
  3 .comment      0000002d  0000000000000000  0000000000000000  0000004c  2**0
                  CONTENTS, READONLY
  4 .note.GNU-stack 00000000  0000000000000000  0000000000000000  00000079  2**0
                  CONTENTS, READONLY
  5 .eh_frame     00000038  0000000000000000  0000000000000000  00000080  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA

从书中给的例子也能看出来这个问题,61页的代码里分别有一个未初始化的全局变量和一个未初始化的静态局部变量。按作者的理解,这两个int的大小应该是8。
从62页书中给出的头信息来看,.bss段的大小是4。作者不知道什么原因,没有注意到这个问题。

更多内容…

国际电话区号列表

2014年6月24日 没有评论

摘自http://zh.wikipedia.org/zh-cn/%E5%9B%BD%E9%99%85%E7%94%B5%E8%AF%9D%E5%8C%BA%E5%8F%B7%E5%88%97%E8%A1%A8

这里是一张全球国际电话服务的区号列表。所有的区号都是根据国际电信联盟(ITU)的E.123和E.164标准所分配的。所有的号码都是前缀号,也就是说这些号码是用来“拨到”目的国家的。每一个国家还有一个前缀来“拨出”自所处的国家,这个前缀叫国际冠码。简言之,国际冠码就是下列国际电话区号前的“+”前缀[1]。因此拨打国际电话的一般顺序是:国际冠码-国际电话区号-封闭电话号码;或者:国际冠码-国际电话区号-国内电话区号-开放电话号码。

目录

区域0 -- 保留
区域1 -- 北美洲
区域2 -- 非洲
区域3 -- 欧洲
区域4 -- 欧洲
区域5 -- 墨西哥及中南美洲
区域6 -- 东南亚及大洋洲
区域7 - 俄罗斯及附近地区 (前苏联)
区域8 -- 东亚及特殊服务
区域9 - 西亚及南亚、中东

更多内容…

修养笔记章2:编译和链接

2014年6月17日 没有评论

用IDE直接把源码生成可执行文件,这个过程叫构建(Build)。
实际上需要分四个步骤:预处理、编译、汇编、链接。

一、预处理。也叫预编译,编译之前的一个步骤。
先把用的示例代码列一下,输出比hello world更简单的:ok.c

#include <stdio.h>

int main(){
        printf("OK!\n");
        return 0;
}

预编译指令:

gcc -E ok.c -o ok.i

预处理的结果有16K多,非常长,内容我就不贴了。
更多内容…

分类: 工作 标签: , ,

修养笔记章1问题:温故而知新

2014年6月17日 没有评论

1、CPU的分配方式(多道程序、分时系统、多任务系统)之间的区别。
  多道程序是CPU闲时启动别的程序,简单来说:程序不用CPU时,被调用程序分配给别人。
  分时系统是每个程序一段时间主动让出CPU,给别的程序用。全靠自觉。
  多任务系统给每个程序分配指定的时间片,过期后强制程序让出CPU。被动的统一调配。

2、多任务系统运行在受硬件保护的级别,这个硬件指的是什么
  目前我能想到的,就是内存分配。MMC是内存访问时的硬件限制机制。可能还有别的。

3、硬盘空间分配时,最小分配单位是扇区。硬盘现在一般用的是逻辑扇区号,硬盘内部的电子设备会自动转成物理的。
  扇区是磁盘的最小可寻址单元(不是分配)。最小可分配单元是操作系统决定的,在windows系统里叫簇(clust),Linux中叫块(block),大小是扇区大小的2^n倍。
  这里面有个问题,只要申请磁盘空间,哪怕是只有一个字节,也会分配一个块大小(比如:1024字节),有1023个字节无法再分配(浪费掉了)。
  另外:windows中磁盘格式化的时候,可以选择“分配单元大小”,就是传说中的簇。
  Linux中查看指定磁盘的块大小,可用

/sbin/tune2fs -l /dev/sda1

查看Linux系统默认的块大小可用

getconf PAGESIZE

更多内容…

关于将数据从内核拷贝到用户空间

2014年6月9日 没有评论

有童鞋分享了unix的五种io模型,留意到里面有一句话“将数据从内核拷贝到用户空间”,怀疑这句话有问题。

unix的五种io模型中,把io读操作分为两个部分:
1、等待数据。
2、将数据从内核拷贝到用户空间。

我以java语言中的实现为例子:

在第三种模型“多路复用”中,第二步的数据读取工作可以是这样的

    SocketChannel socketChannel = (SocketChannel) key.channel();
    ByteBuffer dst = ByteBuffer.allocateDirect(1024);//分配的是直接内存
    socketChannel.read(dst);

数据直接从channel中读取到直接内存,没有从内核空间向用户空间拷贝的过程。

在第五种模型“aio”中,向aio_read函数中传递的缓冲区指针可以是mmap映射出的内存地址,也是内核到内核,没有内核空间向用户空间拷贝的问题。

当然,也可能是我理解有误,欢迎指正~