收藏与学习

1.嵌入式操作系统

自制嵌入式操作系统 DAY1

自制嵌入式操作系统 DAY2

自制嵌入式操作系统 DAY3

自制嵌入式操作系统-源码

RTOS原理与实现

RTOS内功修炼记(七)—— 内存管理 (1到6)

分分钟搞定优先级位图算法

一步一步学习ucos II

NandFlash简介

Yaffs文件系统简介

全部task都create完成后,再init_systick并使能,否则,任务没有创建完成,systick计时结束进入中断进行任务调度,可能会指向空指针,错误!!!!!!!!

2.链表

C语言链表操作详解

《程序设计与数据结构》周立功

3.消息队列

关于Posix的消息队列

POSIX 消息队列函数(mq_open、mq_getattr、mq_send、mq_receive)示例

《嵌入式实时操作系统 RT-Thread设计与实现》

进程间通信之POSIX消息队列-mq_open,mq_send, mq_receive

需要注意以下几点:

1、消息队列的名字只能以一个 ‘/‘开头,名字中不能包含其他的’/’
2、mq_receive() 的第三个参数表示读取消息的长度,不能小于能写入队列中消息的最大大小,即一定要大于等于该队列的 mq_attr 结构中 mq_msgsize 的大小
3、消息的优先级:它是一个小于 MQ_PRIO_MAX 的数,数值越大,优先级越高。 POSIX 消息队列在调用 mq_receive 时总是返回队列中最高优先级的最早消息。如果消息不需要设定优先级,那么可以在 mq_send 是置 msg_prio 为 0, mq_receive 的 msg_prio 置为 NULL
4、默认情况下mq_send和mq_receive是阻塞进行调用,可以通过mq_setattr来设置为O_NONBLOCK,如:
struct mq_attr new_attr;
mq_getattr(mqID, &new_attr);//获取当前属性
new_attr.mq_flags = O_NONBLOCK;//设置为非阻塞
mq_setattr(mqID, &new_attr, NULL)//设置属性

4.事件集

#define TEST_EVENT_ID0          (Event_Id_00)     
#define TEST_EVENT_ID1          (Event_Id_01)
#define TEST_EVENT_ID2          (Event_Id_02)

Event_Handle testEvent = NULL;
Error_Block eb;
Error_init(&eb);

testEvent = Event_create(NULL, &eb);

Event_post(testEvent, TEST_EVENT_ID0);

//或事件发生:事件0或1或2发生(每个事件发生都清除标志位)
eventID = Event_pend(testEvent,
                     Event_Id_NONE,//和
                     (TEST_EVENT_ID0|TEST_EVENT_ID1|TEST_EVENT_ID2),//或
                     BIOS_NO_WAIT);

//与事件发生:事件4和5和6同时发生(同时清除456的标志位)
eventID = Event_pend(testEvent,
                     (TEST_EVENT_ID4|TEST_EVENT_ID5|TEST_EVENT_ID6),//和
                     Event_Id_NONE,//或
                     BIOS_NO_WAIT);

pend触发事件发生后,对应标志位清除。如果代码已经编写了0或1或2发生后,再想发生0与1与2是不可能的!!!!!!因为事件0或1或2分别发生后,每次都清除对应标志位,就不可能实现012的标志位同时存在了

5.线程管理

linux下pthread_cancel无法取消线程的原因

pthread_cancel用法及常见问题

在任务中semaphore_pend挂起,等待另一个线程通过semaphore_post来触发当前线程。实现两个线程之间的同步

6.Redis 远程字典服务

Redis源码分析

Redis dict详解

7.C语言(printf相关、可变参数)

Print各种%输出形式

C语言高级用法---container_of()

C语言基础——字符串指针(指向字符串的指针)

Linux C 字符串函数 sprintf()、snprintf() 详解

_vsnprintf函数的简介和用法

cnt=vsnprintf(buff, size, format, (va_list)arg);

生成的格式化字符串存放在buff中,size为可接受的最大字符串数,format指向可变参数前面的字符串地址,arg指向第一个可变参数(arg可通过va_start和format获得;如果已知要打印arg的首地址,也可以直接取该地址比如某个数组或结构体起始地址),cnt为生成的格式化字符串个数。

LogInfo(LOG, "AU:\r\n%04x %04x %04x %04x \r\n" ,data[0], data[1], data[2], data[3])

vsnprintf函数根据%d %x %s等判断可变参数打印输出的类型及个数。

va_list、va_start和va_end的用法

va_start和va_end使用详解

va_list 、vsnprintf 原理及用法

//ap指向第一个变参的位置,即将第一个变参的地址赋予ap,( ap = (va_list)&v + _INTSIZEOF(v) )

#define va_start(ap,v)        //ap为v的下一个参数地址,v指向已知参数地址(函数的入参至少有一个,ap指向入参v后面的第一个参数)(start最后一定要用end)

获取变参的具体内容,t为变参的类型,如有多个参数,则通过移动ap的指针来获得变参的地址,从而获得内容 ,( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 

由于内存对齐,TMS320C6748(32位计算机)内存每次ap寻址都加4,指针向后移动4个字节(int型)(v+4→ap,ap+4→下一个可变参数)int param = va_arg(args, int);int表示想要获取的返回值类型,param为返回值(如果想依次获得每个可变参数的指针或值,可以用for或while循环加限制条件来实现)(也可获得char或其他类型返回值,为了读取数据完整不丢失,一般读int型即4字节)寻址加4与返回值类型无关,是内存对齐导致的

如果是64位float,也可以按照int型返回值来保存,占8个字节(2个int),vsnprintf输出可变参数时,根据%f,寻址两次,将两个4字节组成1个8字节的float进行输出

8.内存对齐,RAM访问速度大大加快!!!!

C语言结构体类型的定义和使用(二):结构体字节对齐

结构体中的字节对齐问题

调试发现,定义结构体内容为n个int型(32位)变量,但实际printf时,会向结构体地址中写入float型数据(64位),因此需要__attribute__((aligned(8))),以保证读出的float正确!!!

结构体A自身对齐值为8,指定对齐值为系统默认4,则有效对齐值为4,最终大小为24;
结构体B中,attribute((aligned))没有参数,则编译器根据目标机制采用最大最有益的方式对齐,本例试验中系统规定为16字节对齐,所以最终大小为32;
结构体C中,attribute((aligned(1))),意为采用1字节对齐,但是该结构体中有一个成员类型大小为8,所以采用8字节对齐,最终大小为24;
结构体D中,attribute((aligned(4))),意为采用4字节对齐,但是该结构体中有一个成员类型大小为8,所以采用8字节对齐,最终大小为24;
结构体E中,attribute((aligned(8))),意为采用8字节对齐,该结构体中成员类型最大为8,和指定的对齐字节数一样,所以采用8字节,最终大小为24;
结构体F使用__attribute__ ((packed)),即取消优化对齐,则最终大小为各个类型变量值累加为20。

 

关于内存对齐的那些事

轻松搞定内存对齐

内存对齐、内存对齐规则解释、内存对齐原理

memmove 和 memcpy的区别

memmove解决内存重叠问题

进栈出栈,函数入参从右向左取,入栈顺序???再查一下

.................

9.句柄

对线程的新的认识.线程句柄和线程ID

引用、指针和句柄的区别

.................

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值