前排提示:新坑,详情请看下一篇文章
osal_start_system函数
tasksCnt——任务总个数
tasksEvent——指针,指向事件表首地址
tasksArr——数组,每一项都指向事件处理函数
=
idx——变量,用来在事件表中索引
查看是否有事件发生,如果有,tasksEvents[idx]会不为零,则跳出循环。
11-12读取事件
13 事件表中清零
14 调用事件处理函数,其中tasksArr[idx]
GenericApp_ProcessEvent函数
http://nevel.cnblogs.com/p/6370264.html
看函数名前面的指针*号有没有被括号()包含,如果被包含就是函数指针,反之则是指针函数。
是函数指针
指针函数是指带指针的函数,即本质是一个函数,函数返回类型是某一类型的指针。
类型标识符 *函数名(参数表)
int *f(x,y);
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示:
float *fun();
float *p;
p = fun(a);
接受一个数据包并将其地址赋给MSGpkt
OSAL添加新任务
在OSAL_GenericApp.c文件中操作
要添加新任务,需要编写两个函数1)新任务的初始化函数2)新任务的事件处理函数
将事件初始化函数添加在osalInitTasks函数的最后
将事件处理函数的地址加入tasksArr[]数组
注意,1)tasksArr数组里个时间处理函数的排序要与osalInitTasks函数中顺序保持一致
2)为了保存osalInitTasks函数所分配的任务ID需要给每一个任务定义一个全局变量
串口收发基础实验
新增代码有:
unsigned char uartbuf[128]; static void rxCB(uint8 port,uint8 event);//串口相关 halUARTCfg_t uartConfig;//定义串口配置结构体 一下部分对串口进行配置,如是否打开串口,波特率,是否使用流控等 uartConfig.configurde = TRUE; uartConfig.baudRate = HAL_UART_BR_115200; uartConfig.flowControl = FALSE; uartConfig.callBackFunc = rxCB; HalUARTOpen(0,&uartConfig);//最后使用HalUARTOpen对串口进行初始化 static void rxCB(uint8 port,uint8 event) { HalUARTRead(0,uartbuf,16);//调用函数,从串口读取数据并存放在uartbuf中 if(osal_memcmp(uartbuf,"ldztzrh",7))//判断接受到的数据,如果是,返回TURE { HalUARTWrite(0,uartbuf,16);//调用该函数,发送收到的数据 } } //osal_memcmp()经常使用,是一个回调函数,在 uartConfig.callBackFunc = rxCB; 处 //将rxCB传递给了成员callBackFunc,是一个函数指针,也就是将函数的地址传给callBackFunc //这样就可以通过callBackFunc成员函数来调用rxCB()函数了。 //回调函数是在特定条件或事件发生时,由另一方调用的,用于响应
随后,在下载到板子之前,还需要针对条件编译对IAR做出一些设置,
总结:
启用串口功能须按照GalDriverInit要求开启宏定义,TRUE不要输错
下载程序前看工程目前是协调器版本还是终端版本
开发板上有绿灯表示串口上行和下行状态
发送字符串后板子居然无线重复的发回信息,不会自动停下,不知道这例程怎么编成这样的
串口原理剖析
主要使用三个函数:HalUARTOpen()、HALUARTRead()、HALUARTWrite()
HalUARTOpen():初始化,特别需要注意halUARTCfg_t结构体,
加粗部分,baudRata即为波特率
读写部分,TI将串口和DMA结合在了一起,因此读数据函数实际上是堵DMA缓冲区数据。
串口应用扩展实验
流程:终端发送字符串到协调器,协调器串口到pc
协调器修改例程,参考书上,主要修改了消息处理函数:
osal_memcpy(buffer,pkt->cmd.Data,10);//使用osal_memcpy函数将接收到的数据拷贝到buffer中 HalUARTWrita(0,buffer,10);//串口写函数
终端编程
- 需要定时函数周期性的发送数据,使用osal_start_timerEx函数,有三个参数,见图
- 添加新的事件,此例中:#define SEND_DATA_EVENT 0x01
- 此时,定时器函数的参数便可确定,详细参考修改的代码
- 接下来,添加事件的处理函数
因此,可修改终端代码