ucos学习笔记02--内存复制的操作
来源:互联网 发布:开心网域名被抢注案例 编辑:程序博客网 时间:2024/05/22 13:31
//ucos笔记--关于数据复制
//任务之间的通信的两个结构体之间数据复制问题
- //两个结构体的原型如下:
- typedef struct {
- INT16U OSCnt; /* Semaphore count */
- INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
- INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
- } OS_SEM_DATA;
- typedef struct {
- INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_???) */
- INT8U OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
- INT16U OSEventCnt; /* Semaphore Count (not used if other EVENT type) */
- void *OSEventPtr; /* Pointer to message or queue structure */
- INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
- } OS_EVENT;
- /*
- OS_EVENT是事件控制块原型,OS_SEM_DATA是信号量在OSSemQuery里面用到的,用来获取事件控制块中有用的信息。在OSSemQuery函数里面,用了一个循环(新版本的ucos把这个循环改为了一条条赋值语句,因为循环次数最大是8次,为了减少循环的额外开销......)。但是这里其实是可以用强制类型转换简单一个赋值语句就可以搞定的。
- */
- typedef struct {
- OS_SEM_DATA OSEVENTSemdata;
- INT8U OSEventType; /* Type of event control block (see OS_EVENT_TYPE_???) */
- void *OSEventPtr; /* Pointer to message or queue structure */
- } OS_EVENT;
- //结构体无法直接做赋值操作,可以使用一个内存copy函数,返回目的地址
- //=========================================
- //考虑到了内存重叠的问题,不过在正常使用的时候这样的问题应该不会存在
- void *memcopy(void * pvfrom, void *pvto, size_t size)//源码见下面
- //如果那个变量不是放在结构体头的话,就需要知道这个成员的偏移地址
- //用宏算出结构体成员的偏移地址
- #define member_offset(struct_t, member) (int)(&((struct_t *)(0)->member))
- /*
- 做内存复制,实现对OS_SEM_DATA的获取,故ucos里的函数INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)可以这样实现:
- */
- INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata)
- {
- memcopy(pdata, pevent, sizeof(OS_EVENT));
- }
- /*
- 也许效率没直接读取、赋值来的快,但是程序会比较简洁。
- 并且内存复制这一部分可以用内嵌汇编实现,效率问题可根据MCU特性做取舍:单纯的读写内存,某些mcu比较高效。
- */
- //==========================================
- //附内存复制函数的测试程序代码
- #include <stdio.h>
- #include <stdlib.h>
- #define member_offset(struct_t, member) (int)(&(((struct_t *)(0))->member))
- typedef unsigned char byte;
- typedef struct st1
- {
- byte a;
- int b;
- float c;
- }st_1;
- typedef struct st2
- {
- struct st1 st1_v;
- int x;
- }st_2;
- //==================================
- void *memcopy(void *pvfrom, void *pvto, int size);
- int main(void)
- {
- struct st1 *p_st1 = (struct st1 *)malloc(sizeof(st_1));
- struct st2 st2_v1={{11,12,1.2345},13};
- struct st1 *pt = p_st1;
- memcopy((void *)(&st2_v1), (void *)pt, sizeof(st_1));
- printf("%d/n", p_st1->a);
- printf("%d/n", p_st1->b);
- printf("%f/n", p_st1->c);
- }
- void *memcopy(void * pvfrom, void *pvto, int size)
- {
- byte *ptfrom = (byte *)pvfrom;
- byte *ptto = (byte *)pvto;
- printf("size is %d/n",size);
- #if 1
- while(size-->0)
- {
- *(ptto++) = *(ptfrom++);
- }
- #else//#if 1
- //====在网上看到的,说这里需要考虑内存重叠问题,不过看不出什么时候会这样,除非故意的,比如插入排序?
- if((ptfrom<ptto) && ((ptfrom+size-1)>ptto))
- {
- for(int i=size-1; i>=0;i--)
- {
- *(ptto+i) = *(ptfrom+i);
- }
- }
- else
- {
- for(int i=0; i<size;i++)
- {
- *(ptto+i) = *(ptfrom+i);
- }
- }
- #endif//#if 1
- return ptto;
- }
- ucos学习笔记02--内存复制的操作
- ucOS学习笔记(3)——ucOS的数据结构
- ucos学习笔记01---OSUnMapTbl的理解
- stm32-ucos学习笔记
- uCOS-III学习笔记
- ucos II 学习笔记
- ucos学习笔记1
- ucos学习笔记2
- UCOS学习笔记
- UCOS-II学习笔记
- uCOS-III学习笔记
- UCOS学习笔记
- ucos学习笔记一
- uCos的内存管理
- uCos的内存管理
- uCos的内存管理
- uCos的内存管理
- uCos的内存管理
- 转贴-有关TinyXML使用的简单总结
- GuruReborn开博拉!
- asp网页不能正常浏览的解决方法
- ucos学习笔记01---OSUnMapTbl的理解
- 删除一个非空目录(2种方法)
- ucos学习笔记02--内存复制的操作
- -- arm7,44b0x,bootloader,完全分析(收藏)
- Table Name Fixer
- 我刚玩上了 穿越火线 有谁能告诉我开透视么····
- 一元多项式运算
- 藏地密码1: 阅读完毕 用时1天
- 进制转换(十进制转n进制)
- PHP通用分页类(支持php,ajax,html) v1.1.20100329修正版
- 精简ASP购物车类(Session+XML)