关于c语言位域的字节对齐问题

最近在STM32F4上面进行嵌入式开发,需要做通讯,报文规定的字段并不以字节为最小单位,好多2,3位的长度元素 对于C语言,我们一般用位域来解决。

可是,C教科书上给我们讲的位域不占用很多空间的前提没有讲述清楚,经查证,默认情况下C语言并没有规定统一 的字节对齐策略,导致用sizeof计算结构大小的时候结果在不同的平台上结果五花八门。下面代码的结构体,按理是 4个字节,结果默认情况下gcc计算结果为6。

网络资料显示需要对结构体加pack属性, 这下GCC是对了,但是在win平台下面的MinGW结构居然是5
???

玩我呢? 后面搜索MinGW 位域对齐问题,发现MinGW并不像我想象的就是GCC,跟linux平台和cygwin并不完全相同, 至少这个地方表现跟VC++平台一致。

好了,用pragma来指定按字节对齐的方式,按1字节对齐,这样位域才能正确。

代码如下:

#include <QCoreApplication>

#include <stdint.h>

#if defined WIN32 || defined _WIN64 || defined WINNT
    #pragma pack(push,1)
#endif

struct …
more ...

关于c语言const修饰符对指针变量的修饰问题

在看同事的jni幻灯片的时候,看到了const 指针,就顺便聊了下,一直都觉得 带 const 修饰符的都应该 在声明的时候赋值,声明之后,再赋值是不过语法检查的。

结果发现,对于指针来说,情况并不是我想的那样。

对于char *来说,const 未修饰 变量名称时候, 赋值都是在可以后面随意改动的,也就是指针可以 重新任意赋值,但是赋值后的内存区域是不能修改的,但是若 const 是在修饰 变量名称,那么跟 普通类型变量都一样, 需要声明的时候赋值,否则,根本过不了语法检查。

代码如下:

#include <stdio.h>
int main()
{
    const char *a  = "xxxxxx";
    char const  *a1  = "xxxxxx";
    char * const c = "1111111 …
more ...

关于 C语言 里的 反射或者内省 的讨论

在语言里面, 根据class名字能够知道其成员的 功能叫做 内省c语言有没有这个功能.

可以想到的办法是 通过宏,你在定义一个结构体的时候,同时生成了一个数据结构存放了这个class的成员名称, 同时, 得到成员的类型, 比如  struct {int a, float b};

通过例子里面的宏可以得到  int a, float b, 这样的字符串的

这个其实已经解决了上次你做 sql数据库函数时想要的功能

对了  今天开会研究nvram的意思就是以后我就不用写那个数据库的东西了?

如果 再得到成员列表字串的时候把类型分立出来, 然后你可以用 "int", sizeof(int); "int", sizeof(float); 这样的东西再做映射, 然后得到一个结构体类型的时候, 即便只有一个指向 class的指针,我们也有办法 把里面的成员一个一个取出来

这样, 对于数据库这样,你每次存的数据结构不同,但是query,什么的这些操作相同的这些操作,完全可以只写一个组函数方法就够了,而不用每
基本上可以达到 动态语言里面的 …
more ...

学习unix路之愚见

前言

这段时间公司安排带领新人, 加上公司上层软件开发者的一些做事方法和思想我不是很赞同, 深感团队里人的重要性, 以前只是觉得技术和人都不大是问题, 可能机遇才是最难的事情, 但是现在看来,天时地利人和中最怕的是人和了, 一个团队做一件产品,两三年之后还拿不出东西来,做出来的东西如同大学的课程设计,只是一些能工作的代码的组合,界面使用上出现的逻辑以及错误提示达到了令所有常人难以理解的地步,以前真没有这种体会,所以才深感可怕。 这里我并不想对代码层次, 面向对象, 抽象, 以及做C的人根本不懂面向对象这些话题进行口舌,只是结合自己的学习路程, 从单片机硬件到单片机软件,C语言的编程,再到嵌入式linux系统的理解(bootloader到内核以及shell和应用),和python和cpp这样的语言的使用感受来说下我的思维观点: 因为团队很多人并不觉得软件开发都是一回事这种观点, 抽象或者说人的整个做事情思维方式差异太大。

以下是我对新人的学习建议,这里摘录出来,其中基本也是我的思路和思维方式,其实个人愚见: 你见的多了,自然觉得都是一个道理了,大道至简,简单就是美,联系实际生活人的认知和解决问题的方法是如此之统一和简单, 要不然怎么会有哲学的产生?

怎么走unix之路?

作为unix/linux程序员(有可能被逼的,但是已经是了), 并且作为嵌入式程序员,基本的要求是C语言要掌握,并且能够很轻松的给人说明白什么是指针,什么是一板一眼的做事情(或者写程序的方法),面向对象是一个 很好的方法,不过面向对象的本质很少有人能够真正明白 …

more ...

linux flash插件等程序声音不正常的原因: 笔记本多个声卡, 需要配置

前段实际系统是Arch linux, 当时什么程序都能放出声音来就是flash不行,一直无声状态, 始终没有搞定。

这几天因为做嵌入式的原因,系统换成了Funtoo, 个人感觉就是改进了Gentoo 的 emerge --sync 吧, 其他的还不怎么明显, 也没体会到,感觉根Gentoo无异了, 不过系统装起来, 声音还是不正常, 播放mplayer说

alsa-lib: pcm_dmix.c:1018:(snd_pcm_dmix_open) unable to open slave

Google之发现是因为系统多个声卡, 没有配置的情况下会选择0, alsamixer里面我的声卡也是两个, 第一个是什么hdmi的声卡, 哎, 感觉无奈,这个东东有用么, 不过还是自己水平低, 真正的声卡处于第二个位置, 突然想到这也是flash无声的缘故了吧, 随即编辑 .asoundrc 或者 /etc/asound.conf

pcm.!default {
    type hw
    card 1
}

ctl …
more ...

使用ostinato做网络开发分析辅助工具

最近参与公司一个项目, 需要在L2工作, 封包是经常的事情,之前一直用N2X, 需要排队, 后面搜索网络发现了ostinato工具, 虽然还在成长中, 但是已经非常强大够用了.

特淘宝淘了个双口的千兆网卡, 拿回来装起, 先跑server drone程序, 然后开ostinato客户端, 计算机上的eth0,1,2均认的出来, 然后drone跑对了之后就port group可用了, 点击eth, 新建stream里面就可以选择L2, Vlan等选项, 非常强大, 另外发现intel的网卡芯片才支持vlan, 可以抓到带vlan标签的包, 正好淘的网卡是intel的服务器专用卡, 不错!,

这里记下, 有用的同学可以参考下.

more ...

acer aspire 4560G A6 apu notebook arch linux installation tips

arch linux or gentoo linux installtion on Acer aspire 4560G will always have troubles.

the video driver. JUST NOTE

  • amd catalyst driver will not works at all, I tired 1 year before, it failed. and failed again today.

So, you only need the opensource driver xf86-video-ati and use radeon only …

more ...

如何恢复mysql inno db 损毁的数据库表内容 ?

一次机器的强制关机,导致了服务器mysql数据库启动失败, 说是数据库因为关机问题,数据写入不正常, 无法启动, 使用mysql的数据库恢复功能没能成功

因为自己当时不知道数据库自己恢复的条件,只拷贝备份了数据库目录, 并没有备份idb和idb的log1,log2两个文件,所以自动恢复没法进行,基本上是数据

已经丢失了

网上去搜索发现有个恢复工具, 开源的 就拿试试, 果然最终还是解救到了数据.

基本思路是, inno db引擎的数据库文件是 frm放 表项索引, idb里面是表的具体内容, 只要idb文件在, 一般都是可以恢复的

步骤如下:

    1. 使用工具 将idb文件分割得到很多page文件
    1. 然后page文件全部cat到一个大文件
  • 3. 找到你的表的结构: 我这里因为是服务器还在, 可以从原来正确的数据库里面读取到表的结构, 就是知道表当时是如何创建的

,使用 show table create <tablename>; sql 命令 就可以得到.

这里工具里面有个脚本, 配置上你的参数, 叫自己去读,然后会生成一个头文件, 这个下面需要用来编译提取这个表用的解析器.

但是我的情况是数据库新建的表没有使用innodb格式了,所以需要将那个脚本里面的判断是不是innodb的语句注释 …

more ...