一些笔记

 /*对实习项目掉坑笔记上传*/

  1. 信号量等事件使用时,一定要创建调用OSSemCreate(0);,否则,信号量一直存在,失去意义。
  2. 十 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)
  3. *p=常数
  4. 内存分配一定要在内存创建之后!!!! 先对内存分区进行创建,否则内存在flash中存在,发生错误!!!!!
  5. 中断级任务切换,有一个全局变量,调用中断进入函数时候这个全局变量+1,调用中断退出函数以后,这个全局变量-1,操作系统根据这个变量判定嵌套层数,如果有没加的,会导致程序莫名跑飞。
  6. 中端级别任务调度时候,返回时还会产生一次任务调度,不一定是回原来的任务继续执行。
  7. 在中断嵌套中若使用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……

  1. INT8U OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli);
  2. 一些笔记最大允许事件的个数,如果超过,创建不成功

如果此处如果事件的数量超过最大允许的范围,编译不会报错,但是create信号量不成功,这个信号量一直存在,当有任务需要等待这个信号量的时候,会一直有信号量,和没有create信号量的效果一样。

11、配置can中断的时候,一定要先使能时钟,否则配置无效!对中断的配置不能改变IER寄存器的值。