最近程序遇到一个小概率出core的bug,高压力下大概10分钟左右就会出core,gdb查看发现一个指针高四字节被置0xffffffff了,低四字节正常。
    该指针是局部变量,存放在栈上,排除了线程间同步互斥写坏数据的可能。
    该指针前后变量均正常,都是指针,排除了写越界的可能。

    通过日志查看,在返回该指针的函数返回前,指针正常,返回后高四字节即被置0xffffffff了。推断应该是函数返回的过程中遭到了破坏。

    但不知道为什么返回的过程中会出错,请教了下组内高工,高人就是高人,一听问题描述就表示应该是函数声明的问题。

    原来,在调用另一个so文件中的函数时,如果没有该函数的声明,由于从该so的符号表里可以找到函数,所以编译可以通过,但gcc会把这个函数返回值按默认的int处理,这种情况下,32位机编译的程序是没问题的,但64位机上指针是8字节,导致高四字节数据丢失。但返回的指针超过int值域时,高四字节数据丢失,导致指针被破坏。

   所以函数声明还是不可或缺的。
Tags: ,

stm32之串口

[| 不指定 2011/12/02 00:53]
    在最基本的GPIO使用熟练后,开始下一步:调试。

    磨刀不误砍柴功。如果要写比较复杂的程序,调试是必需品。虽然jlink可以断点调试,但是效率低、查看变量值麻烦。程序比较大的时候相当复杂。对于普通程序,可以用日志的方式来进行调试,将日志打印到标准输出或者是文件,然后进行调试。在单片机开发中,可以通过串口通讯来完成这个事情,单片机将日志通过串口输出到开发机上,在开发机端使用串口工具进行查看。

    首先是串口的概念,在网上搜索资料相当恼火,大部分都是直接就说串口怎么怎么用,如何如何好,要么就是直接大段代码。很蛋疼的是,到底啥是串口?单片机上哪个引脚是串口?

    首先明确串口的概念,pc端串口分为25针和9针两种,9针为简化版,在台式机上一般都有,笔记本上已经绝迹了。
    对于单片机来说,如果要串口通讯,最简单的方式其实是两根线:rx,tx。

    一般要问了,为啥两根线就能干的活要9根甚至25根线呢?原来两根线只是最基本的串口通讯需要的。如果需要硬件流控等功能,还需要其他引脚的帮助。在这里简单起见,先使用最简单的。

    由于笔记本没有串口,手头有两块usb转串口板,一块是pl2303的,非常便宜,10块钱。但功能也最简单,只有4根线,rx,tx,vcc,gnd,兼容性一般,需要安装驱动才能使用。还有一块基于ft232的,将近50块,功能也比较强大,支持9针插头,兼容性好,插上后可使用windows update自动搜索驱动并安装。

    这次选用了p2303。

    下一步,就是怎么连接的问题,板上密密麻麻近百个引脚,应该如何连接呢?这时需要查询datasheet。

    stm32f103ze有5个串口通道。usart1最快。在这里我准备先拿2试试。datasheet上显示a2为tx,a3为rx。很快将线插好。vcc和gnd也接上。现在电路连通了(注意,插拔串口的时候需要断电操作,否则容易损坏串口)

    然后就是编程。至于程序网络上就大把了。随便找个文档就是大堆。挑个有注释的看。大致流程如下:(最简单的,不带中断)


    首先启用usart时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

    然后是初始化gpio引脚:a3设置为GPIO_Mode_IN_FLOATING,a2设置为GPIO_Mode_AF_PP

    然后是串口设置:

    
引用
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART2 , &USART_InitStructure);
USART_Cmd(USART2, ENABLE);


   波特率9600,字长8,停止位1,不校验,硬件流控无,开启信息收发,启用串口。

    然后就可以用USART_SendData发送数据了。

需要注意的地方:不要忘记开启时钟,这里要两次时钟操作,一次给串口,一次给io口,缺一不可。
Tags: , , ,

入手stm32最小系统板

[| 不指定 2011/11/28 13:50]
    之前在大学的时候弄过一段时间的嵌入式,后来因为小批量的制作电路板成本实在很高,后来没有继续搞了。最近看到有同事在用arduino,又激发了我的兴趣,准备搞一下。

    调研了一下,发现arduino虽然ide看起来很好玩,但是性能和价格都不靠谱。性能是8位mcu,20mhz主频,2ksram,128-2048k flash,总体性能差了不少。并且由于现在在国内属于小众,价格也很不给力。

    在调研的过程中发现了stm32,这是基于arm Cortex-M3内核的一个mcu,32位mcu,主频72mhz,应用的比较多,资料也不少,于是决定入手一个这个。

    先是看了开发板,发现附带的外设过多,很乱,不喜欢,决定买个最小系统版,然后自己买别的扩展板来扩展。为了扩展性考虑选择了flash和sram容量都比较大的一款:stm32f103ze的最小系统板,512k flash,64k sram。足够跑一个比较复杂的程序了,咨询了一下嵌入式的同学,这个配置跑ucos之类的系统也是足够了。

    除了买板,一些其他的配件也是必须的。jlink调试器、面包板、跳线、直插电阻、发光二级管,都买了一些。同时还买了红外感应模块、isp下载模块、光感应模块,用来练手。一共200出头,很便宜。

    为了时效性考虑,卖家选的是北京的,不过查快递信息的时候发现貌似卖家在上地八街。。。。这么近,还不如自取呢。



    周日晚上搞了一会,装了keil,jlink驱动等等,鼓捣了一下,发现比搞普通c程序麻烦不少,还要管时钟、中断之类的。不过很有意思,稍后会搞点有意思的东西出来。
    
Tags: , ,

Soso Spider 不支持base属性

[| 不指定 2011/10/27 19:17]
    今天博客新迁移,由于对静态化url的改动非常大,难免有遗漏的地方,所以非常关注access日志,看看爬虫们遇到了哪些困扰。

    在看日志的时候发现一个有意思的现象,google和百度的蜘蛛今天很不活跃,对于站点的大规模改变似乎并不感兴趣,对css,js不屑一顾,而soso的spider非常活跃,把每个链接都详细爬了一遍,但发现一个问题:

     新博客的url是采用base设置+相对url的模式,soso的spider似乎并不识别base标签,直接把相对url附加到当前url之后进行抓取,导致了很多404请求。查了一下,base属性是html标准属性,soso不支持这个属性应该算是个bug了。




Tags: , , ,

HTTP请求返回码204

[| 不指定 2011/10/27 18:49]
    今天测试lighttpd是否支持delete请求,发现webdav模块可以实现此功能。不过发现http返回码是204,查了一下,原来此状态码的意思是说请求成功了,但是没有结果返回来。搜到鸟哥一篇文章,讲的很不错,转载一下:


http://www.laruence.com/2011/01/20/1844.html

之前和人讨论过这个问题,,, 今天感冒在家休息, 就回忆了一下, 整理如下.

我们很多的应用在使用Ajax的时候, 大多数情况都是询问型操作, 比如提交数据, 则Ajax只是期待服务器返回:

{status: 0, message:""} //status 0代表成功, 非零的时候, message中包含出错信息.
我们知道HTTP的状态码, 2xx都是表示成功, 而HTTP的204(No Content)响应, 就表示执行成功, 但是没有数据, 浏览器不用刷新页面.也不用导向新的页面.

在HTTP RFC 2616中关于204的描述如下:

引用
If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent’s active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent’s active view.


类似的还有205 Reset Content, 表示执行成功, 重置页面(Form表单).

引用
The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. This response is primarily intended to allow input for actions to take place via user input, followed by a clearing of the form in which the input is given so that the user can easily initiate another input action.


于是, 当有一些服务, 只是返回成功与否的时候, 可以尝试使用HTTP的状态码来作为返回信息, 而省掉多余的数据传输, 比如REST中的DELETE和如上所述的查询式Ajax请求.

最后说说205, 205的意思是在接受了浏览器POST请求以后处理成功以后, 告诉浏览器, 执行成功了, 请清空用户填写的Form表单, 方便用户再次填写,

总的来说, 204适合多次对一个Item进行更新, 而205则适合多次提交一个系列的Item.

但, 请注意, 目前还没有一个浏览器支持205, 大部分的浏览器, 都会把205当做204或者200同样对待.
Tags: , , , ,

修改域名DNS服务器

[| 不指定 2011/10/27 12:49]
    最近几天监控频频爆出dns无法解析问题,群里关注了下,发现godaddy的dns服务器现在开始被和谐了,于是决定换一个。dnspod国人用的比较多,不过在国内总感觉比较扯。还是用he的比较可靠一点。

    修改很快,将解析记录都导入he的管理页面后去godaddy切换ns记录,本地nslookup了一下,切换了。

    在此期间注意到godaddy有了DNSSec记录功能,看了下,应该是防止dns欺骗的,暂时用不到,没有搞。
Tags: , , ,

blog迁移

[| 不指定 2011/10/27 02:02]
    经历了很长时间的准备后,终于把blog迁移了。哈哈,庆祝一下。

    考虑了很长时间,最后还是决定还在老服务器上开博客,先不动地方,因为新服务器最近网络变得非常差,失去了信心,而老服务器基本稳定,还能接受,稳妥起见,并且为了避免给搜索引擎带来太大的困扰,所以没有换服务器。


    迁移前先升级了下php,之前php还是5.1,实在太老了,加入了centos-test源,yum update提示我几个php依赖错误,卸掉那几个包后重新安装,好了,还有几个包源里没有,比如filter,查了下,原来从5.2起整合进php了,自然也不需要了。还有eaccelerate似乎也找不到,下了源码编译。然后把自己写的模块重新编译一遍,一切正常,restart php。哈哈,升级了。

    之前已经修改、测试好了博客,一些配置也配置好了,所以迁移显得非常简单,直接从代码库中拉出代码到指定位置,代码就部署完成。使用昨天编写的数据导入脚本,把数据导入(期间出了个小插曲,php会对同样连接条件的连接请求进行复用,导致数据库use错乱,后来一个用localhost一个用127.0.0.1才好了,这个是始料未及的,因为之前是在两台机器间迁移的)。然后根据之前写的rewrite规则修改nginx配置文件,重启~ok了。

    心情不错,写博客又有动力了。
Tags: ,
最近又看了几个vps,总感觉为啥相同配置,相同线路,人家跑wp,我跑自制小博客。人家都比我快得多。

之前一直想当然,认为是网络问题之类的。由于今天考虑到了博客迁移,所以这个问题就提上日程了。于是打开chrome调试工具,看了下时间。

一看不要紧,终于找到瓶颈了。。

首先是jquery.js,最早用本机,后来嫌大,用了google提供的,由于最近和谐,google的连接速度非常慢,导致页面一直卡在下载jquery.js上。
由于是静态文件,比较大的体积,且seo无关,这就需要考虑把文件放在一个网络连接比较快的地方,显然放到国内是值得考虑的。
首先试了一下一款云存储产品,发现速度倒是很快,但是无法开启gzip,这个无法忍受。转而考虑比较专业的web托管,一想,sae就是专门干这个的,直接放到sae上最好。于是在sae上申请了个应用,吧jquery.js和几个比较大的图片移过去了。立竿见影,速度提升极大。

再看,发现google的统计代码加载也很慢,反正我也不怎么看google的统计,注释掉。

再访问,飞一般的速度~~~~~~

zabbix安装

[| 2011/10/20 23:34]
今天看到一个非常强大的服务器监控程序:zabbix。装了一下。

首先下来源码,最新源码是1.8.8.解压开,configure。缺了一些库,一个一个装上。没啥大问题,唯一一个问题是在打开--enable-static后会报找不到libcurl,应该是libcurl没有提供静态库。时间不多,没有细究,去掉了--enable-static,编译成动态的了。

./configure --prefix=/home/abc/zabbix --enable-server --enable-agent --with-mysql --with-net-snmp=/home/abc/snmpd/bin/net-snmp-config --with-libcurl --with-jabber --enable-ipv6 --with-ssh2

然后make install。这个比较怪,没有单独的make过程,直接make install了。

然后发现只有bin,sbin,share。zabbix是软件免费,服务收费的。怪不得做的这么不自动化,估计想提高门槛好收费。

zabbix依赖webserver、php、mysql。这些软件我之前已经有了,不用再装了。

先在mysql里建表,去源码里找到
create/schema/mysql.sql
create/data/data.sql
create/data/image_mysql.sql

依次导入到mysql里。

然后在zabbix里mkdir etc
将misc/conf/zabbix_*都拷贝到etc里。配置了一下mysql连接信息。

misc/init.d里面有启动用的脚本,我看了一下,感觉还是自己写比较好。

直接启动,告诉我找不到libnetsnmp.so.30。估计是我snmp是自己编译的,zabbix做的有问题,链接路径搞错了,于是先
export LD_LIBRARY_PATH=/*****/snmpd/lib

再启动即可。


然后配置web管理页面。

frontends/php/*里的php文件拷贝到指定位置。开始配置,发现zabbix有个特点,要求php的最大执行时间超长,估计是数据多了处理比较慢。不配好就不能安装,配好后进入管理后台,默认账号和密码是admin和zabbix。进去后配置了下。网页做得比较土,不过功能很强大,很多配置项。

刚开始只启动了zabbix_server,管理后台老是提示无法连接云云,启动了zabbix_agentd后可以监控了。感觉跟文档不符,文档似乎说server也能够监控的。没打算细研究,所以没有细究。

管理页面还支持中文,不错。

现有的小破vps还不至于用这么重量的监控,试试而已。
之前一直以为shell脚本中没法处理信号,所以也没有探究过,突然发现是可以的。

#!/bin/bash

abc(){
echo "signal receive"
}
trap 'abc' INT
sleep 100

这个脚本会在收到ctrl+c的时候打印signal receive。
分页: 11/33 第一页 上页 6 7 8 9 10 11 12 13 14 15 下页 最后页 [ 显示模式: 摘要 | 列表 ]