<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dongpy的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/dongpy</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; dongpy]]></copyright><item><title><![CDATA[【讨论】关于跨平台]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/6885129</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/6885129</guid><author>dongpy</author><pubDate>Tue, 18 Oct 2011 16:27:27 +0800</pubDate><description><![CDATA[跨平台是软件的一个重要指标。一般程序可分为平台无关和平台相关两部分，平台相关部分主要涉及外围设备（如串口、键盘、鼠标、LCD等）和操作系统API（如定时器、互斥锁、文件系统操作、线程操作等）。
除了程序本身的跨平台需求外，还有种应用是对目标机的模拟，例如在PC上模拟一些嵌入式平]]></description><category></category></item><item><title><![CDATA[【基础】查表法]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/6883930</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/6883930</guid><author>dongpy</author><pubDate>Tue, 18 Oct 2011 11:37:44 +0800</pubDate><description><![CDATA[查表法是将一些事先计算好的结果，存储在常量数组中，运行时节省计算开销。
例如，
计算字节中位1的个数，
int countBits( unsigned char dat )
{
   static char nBitTab[256] = { 0, 1, 1, 2, 1,]]></description><category></category></item><item><title><![CDATA[【讨论】简析文件操作]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4744394</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4744394</guid><author>dongpy</author><pubDate>Thu, 29 Oct 2009 18:04:00 +0800</pubDate><description><![CDATA[   文件操作在程序设计中使用较多，常见操作有打开、读、写、关闭等。本文将讨论文件操作涉及的相关内容，以Linux平台为例。1.  结构   文件操作是应用程序访问文件系统的过程。下面简要讨论文件系统的结构，如图1所示。图1       文件系统结构示意图     应用程序通过文件描述符int fd访问文件，执行文件操作（如系统调用read）时，先从描述符表中找到文件对象，然后]]></description><category></category></item><item><title><![CDATA[【小结】温故知新]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4555939</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4555939</guid><author>dongpy</author><pubDate>Tue, 15 Sep 2009 19:08:00 +0800</pubDate><description><![CDATA[    这几天较空闲，回顾了以前留下的工作日志和记录，温故知新，并列出一些到博客，与大家共享和讨论，不当之处，多谢指正。]]></description><category></category></item><item><title><![CDATA[【讨论】简析堆内存]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4555875</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4555875</guid><author>dongpy</author><pubDate>Tue, 15 Sep 2009 18:44:00 +0800</pubDate><description><![CDATA[    堆内存是程序设计中使用最多的，操作灵活，可分配空间大，但管理麻烦，搞不好还会内存泄露和产生内存碎片。1.  接口       用户空间示意图如下，堆区从数据段尾端开始生长，动态分配普通大小的内存，超大块内存则直接在共享内存区（文件映射区）映射空间。 图1       进程地址空间示意图内核记录了进程堆空间的位置，并提供系统调用brk/sbrk给用户，动态伸缩该空]]></description><category></category></item><item><title><![CDATA[【讨论】8位16位32位等内建类型数据操作的比较]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4554225</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4554225</guid><author>dongpy</author><pubDate>Tue, 15 Sep 2009 12:06:00 +0800</pubDate><description><![CDATA[//32位机上,8位16位32位操作的效率比较int wordinc (int a){      /*     add r0, r0, #1     */ /* movl 8(%ebp), %eax  incl %eax */       return a + 1;  }    short shortinc (short a)    ]]></description><category></category></item><item><title><![CDATA[【讨论】两种循环方式的比较]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4554186</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4554186</guid><author>dongpy</author><pubDate>Tue, 15 Sep 2009 11:56:00 +0800</pubDate><description><![CDATA[C语言中两种常用循环方式及对应汇编代码（1） X86汇编83:       int sum = 0x10;0040B8E8   mov         dword ptr [ebp-4],10h84:       for ( int i = 0; i 0040B8EF   mov         dword ptr [ebp-8],00040B8F6   jmp      ]]></description><category></category></item><item><title><![CDATA[【例子】求凸包算法（扫描法）]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552315</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552315</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 18:48:00 +0800</pubDate><description><![CDATA[#include #include #include typedef char    V_INT8; // 8 bit signedtypedef unsigned char  V_UINT8; // 8 bit unsignedtypedef short    V_INT16; // 16 bit signedtypedef unsigned short  V_UIN]]></description><category></category></item><item><title><![CDATA[【例子】“首次匹配法”动态内存分配的实现]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552301</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552301</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 18:45:00 +0800</pubDate><description><![CDATA[ #include #include typedef unsigned int UINT;#define MEM_SIZE (1<<20)UINT memPool[MEM_SIZE];//双向链表struct VListHead { VListHead() {  initListHead(); }  void addListNext(]]></description><category></category></item><item><title><![CDATA[【讨论】有符号数和无符号数运算效率]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552280</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552280</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 18:34:00 +0800</pubDate><description><![CDATA[#include #include #include #include "VTimetest.h"int TIMES = 9999;int main(int argc, char* argv[]){    int j; scanf( "%d", &j );      Timetest t; t.StartTime();  for ( int i = 1; i  {  j = j / i; } ]]></description><category></category></item><item><title><![CDATA[【例子】堆栈中运行程序]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552257</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552257</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 18:23:00 +0800</pubDate><description><![CDATA[#include#includetypedef int (*PFunc0)(const char*,...);void test(){  PFunc0 pf = printf; pf("test/n");// printf("1");  //栈上直接调用函数会出错，用函数指针正常。应该是相对偏移和绝对偏移的原因。}typedef void (*PFunc]]></description><category></category></item><item><title><![CDATA[【讨论】文件操作的原子性]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552237</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552237</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 18:19:00 +0800</pubDate><description><![CDATA[#include #include #include #include #include #include #include #include const char *fileName = "/dev/sram-mmap";  //"test"#define SleepMs( ms ) ( usleep( (ms)*1000 ) )#define T]]></description><category></category></item><item><title><![CDATA[【讨论】malloc的可重入性和线程安全性]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552210</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552210</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 18:08:00 +0800</pubDate><description><![CDATA[#include #include #include #include #include #include #include #define TRUE 1#define FALSE 0int GP[10];int num = 10;pthread_mutex_t  _mutex = PTHREAD_MUTEX_INITIALIZER;]]></description><category></category></item><item><title><![CDATA[【讨论】关于堆栈提交页面与保留页面]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552172</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552172</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 17:55:00 +0800</pubDate><description><![CDATA[线程的堆栈大小有上限值。线程创建时，系统会在进程地址空间的堆栈区，给线程预留这个大小的空间。 线程初始运行时，只提交了少量的页面（即大部分地址空间没有映射，作为保留页面）。 随着栈的深入，初始提交的页面不够用，就要扩充堆栈。 扩充堆栈只要将相邻页面，加入到进程的虚拟地址空间，并映射物理页面。 由于堆栈的访问具有空间局部性，所以系统根据缺页的地址和当前提交页面的距离来]]></description><category></category></item><item><title><![CDATA[【基础】关于Linux平台malloc的写时拷贝(延迟分配)]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4552062</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4552062</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 17:26:00 +0800</pubDate><description><![CDATA[Linux内核定义了“零页面”（内容全为0的一个物理页，且物理地址固定），应用层的内存分配请求，如栈扩展、堆分配、静态分配等，分配线性地址后，就将页表项条目指向“零页面”（指定初始值的情况除外），这样“零页面”就被所有进程共享，当向页面执行写入操作时，内核就会新分配一个物理页，实行“写时拷贝”操作，这样就实现了物理页面的延迟分配（如果只有读没有写，则无需另分配物理页）。动态内存通过glib]]></description><category></category></item><item><title><![CDATA[【基础】关于栈内存分布的测试]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/4551889</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/4551889</guid><author>dongpy</author><pubDate>Mon, 14 Sep 2009 16:45:00 +0800</pubDate><description><![CDATA[int main(){ int arr[1]; arr[32] = 1;  //访问到栈底// arr[33] = 1;  //出错，Access Violation  arr[-3039] = 2;   //可直接访问的最顶栈空间(可见第一次分配的栈空间是3039+32+1= 3072 DWORD, //即12KB,3个页面大小)，索引换成-3040则出错(A]]></description><category></category></item><item><title><![CDATA[【基础】程序中遇到的一个小陷阱]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/1388265</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/1388265</guid><author>dongpy</author><pubDate>Thu, 16 Nov 2006 15:49:00 +0800</pubDate><description><![CDATA[ typedef unsigned int UINT;#define SetBlockHeadSize(pInfo, dwords)  ( (*(pInfo) &= 0x3 ) |= ( (dwords)#define GetBlockHeadSize(pInfo) ( *(pInfo) >> 2 )        //返回DWORD数int main(int argc, char* ar]]></description><category></category></item><item><title><![CDATA[【基础】关于const写保护]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/1380174</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/1380174</guid><author>dongpy</author><pubDate>Sun, 12 Nov 2006 15:23:00 +0800</pubDate><description><![CDATA[const int x = 0;int main(){    const int y = 0;    *(int*)&x = 1;         //Fail   *(int*)&y = 1;          //OK    return 0;}//*(int*)&x = 1; 访问失败，因为链接器把x放在可执行文件的常量数据段中，这里const起到了写保护的作用；//*(int*)&]]></description><category></category></item><item><title><![CDATA[【讨论】++int是否为原子操作]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/1370296</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/1370296</guid><author>dongpy</author><pubDate>Mon, 06 Nov 2006 22:18:00 +0800</pubDate><description><![CDATA[测试代码如下：#include stdio.h>#include pthread.h>#define TIMES 999999U#define THR_MAX 6unsigned int counts = 0;void *thrdFunc(void*)...{        for ( int i=0;i  TIMES; ++i )    ...{        ++counts;    ]]></description><category></category></item><item><title><![CDATA[【例子】线程安全的共享缓冲队列]]></title><link>https://blog.youkuaiyun.com/dongpy/article/details/1370175</link><guid>https://blog.youkuaiyun.com/dongpy/article/details/1370175</guid><author>dongpy</author><pubDate>Mon, 06 Nov 2006 20:50:00 +0800</pubDate><description><![CDATA[#include #include #include typedef int                V_INT32;typedef unsigned int        V_UINT32;struct VQueueIdx{...}{    VQueueIdx(): idx_new( 0 ), idx_old( 0 )    {}    void  resetInfo()    {..]]></description><category></category></item></channel></rss>