一些笔记
/*对实习项目掉坑笔记上传*/
- 信号量等事件使用时,一定要创建调用OSSemCreate(0);,否则,信号量一直存在,失去意义。
- 十 10 即10^1
百 100 即10^2
千 1 000 即10^3
兆 1 000 000 即10^6
吉 1 000 000 000 即10^9
太 1 000 000 000 000 即10^12
分 0.1 即10^(-1)
厘 0.01 即10^(-2)
毫 0.001 即10^(-3)
微 0.000 001 即10^(-6)
纳 0.000 000 001 即10^(-9)
皮 0.000 000 000 001 即10^(-12) - *p=常数
- 内存分配一定要在内存创建之后!!!! 先对内存分区进行创建,否则内存在flash中存在,发生错误!!!!!
- 中断级任务切换,有一个全局变量,调用中断进入函数时候这个全局变量+1,调用中断退出函数以后,这个全局变量-1,操作系统根据这个变量判定嵌套层数,如果有没加的,会导致程序莫名跑飞。
- 中端级别任务调度时候,返回时还会产生一次任务调度,不一定是回原来的任务继续执行。
- 在中断嵌套中若使用Post或 Resume想要执行任务调度也只能等到嵌套结束才能执行。uCOS-II支持中断嵌套,不用担心中断的响应问题,但是一旦中断嵌套之后就会出现很多延时 的问题,将会导致整个系统的实时性下降,比如图示的TaskA就因为中断嵌套,并且因为中断嵌套结束后TaskB接受到信号量而执行,使得其延时效果大大 超出我们想象,而且中间还缺了一步时钟周期,甚至导致这个周期满负荷(空闲任务不会执行到)。虽然画的有点夸张,但是这不得不引起我们的注意。所以通常推 荐中断服务函数写的越短越好,一个好的方法是,清除了中断标志后仅仅发送一个信号量通知别的任务执行,将所有需要花时间运行的工作交给任务而不是留给中断 服务函数处理。
9、结构体定义如下:
typedef struct
{
uint32_t StdId;
uint32_t ExtId;
uint8_t IDE;
uint8_t RTR;
uint8_t DLC;
uint8_t Data[8];
uint8_t FMI;
} CanRxMsg;
uint32_t StdId; 标准帧的ID,按照CAN协议,标准帧ID占11bit,所以该成员变量取值从0到0x7FF,
uint32_t ExtId; 扩展帧ID,按照CAN协议,扩展帧ID占29bit(非连续,第11bit后穿插SRR和IDE),取值从0到0x1FFFFFFF;
uint8_t IDE; 消息标识符类型,CAN协议中标准帧为显性,扩展帧隐形,STM32中标准帧该字段为0x0,扩展帧为0x4,定义有宏;
uint8_t RTR; 远程帧标识,正常帧值为0x0,远程帧为0x2;定义有宏CAN_RTR_DATA和CAN_RTR_REMOTE;
uint8_t DLC; 消息长度,0到8个字节。
uint8_t Data[8]; 消息的具体内容。
uint8_t FMI; 过滤模式,总共有14中,定义有宏,其值依次为0x1,0x2,0x4,0x8,0x10,0x20,0x40……
- INT8U OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);
-
最大允许事件的个数,如果超过,创建不成功
如果此处如果事件的数量超过最大允许的范围,编译不会报错,但是create信号量不成功,这个信号量一直存在,当有任务需要等待这个信号量的时候,会一直有信号量,和没有create信号量的效果一样。
11、配置can中断的时候,一定要先使能时钟,否则配置无效!对中断的配置不能改变IER寄存器的值。