[C] 纯文本查看 复制代码 /*
*********************************************************************************************************
* 函 数 名: AppTaskCANFD
* 功能说明: CANFD处理任务。
* 形 参: 无
* 返 回 值: 无
* 优 先 级: osPriorityNormal6
*********************************************************************************************************
*/
void AppTaskCANFD(void *argument){
uint8_t tx_buf[64];
MSG_T msg;
bsp_StartAutoTimer(0, 500); /* 启动1个500ms的自动重装的定时器 */
for(uint8_t i = 0;i<64;i++){
tx_buf[i] = i;
}
bsp_InitCan1(); /* 初始化CAN1 */
bsp_InitCan2(); /* 初始化CAN2 */
int wi = 0;
while(1)
{
/* 相对延迟 */
osDelay(1);
wi++;
if(wi > 1000){
printf("CAN1发送消息给CAN1\r\n");
can1_SendPacket(tx_buf, FDCAN_DLC_BYTES_64);
wi=0;
}
/* 判断定时器超时时间 */
if (bsp_CheckTimer(0))
{
/* 每隔500ms 进来一次 */
bsp_LedToggle(2);
}
if (bsp_GetMsg(&msg))
{
switch (msg.MsgCode)
{
case MSG_CAN1_RxFIFO0:
printf("CAN1 RxFIFO0收到数据:\r\n");
print_int_array(g_Can1RxData, 64);
break;
case MSG_CAN1_RxFIFO1:
printf("CAN1 RxFIFO1收到数据:\r\n");
print_int_array(g_Can1RxData, 64);
break;
case MSG_CAN1_RxBuffer:
printf("CAN1 RxBuffer:\r\n");
print_int_array(g_Can1RxData, 64);
break;
case MSG_CAN1_TxFIFO:
printf("CAN1 TxFIFO发送完成数据\r\n");
break;
case MSG_CAN1_TxBuffer:
printf("CAN1 TxBuffer发送完成数据\r\n");
break;
case MSG_CAN2_RxFIFO0:
printf("CAN2 RxFIFO0收到消息\r\n");
print_int_array(g_Can2RxData, 64);
break;
case MSG_CAN2_RxFIFO1:
printf("CAN2 RxFIFO1收到消息\r\n");
print_int_array(g_Can2RxData, 64);
break;
case MSG_CAN2_RxBuffer:
printf("CAN2 RxBuffer收到消息\r\n");
print_int_array(g_Can2RxData, 64);
break;
case MSG_CAN2_TxFIFO:
printf("CAN2 TxFIFO发送完成\r\n");
break;
case MSG_CAN2_TxBuffer:
printf("CAN2 TxBuffer发送完成\r\n");
break;
}
}
}
}
这个使用 while 轮询 有个延迟 osDelay(1); 就是非实时的
[C] 纯文本查看 复制代码 //*********************Can1 */
//空闲中断标志
typedef struct {
//EventID ID; // 回调事件标志id
RxFunCan1 fun; // 指向函数的指针
} CallbackStructureCan1; //回调结构
CallbackStructureCan1 *CallBatRxCan1 = NULL; //回调表
uint8_t CallBatRxLenCan1 = 0; //回调表成员数
//释放回调 表
void CallBatFreeCan1(void) {
free(CallBatRxCan1);
CallBatRxCan1 = NULL;
CallBatRxLenCan1 = 0;
}
/****************
注册回调函数,成功返回ID 失败返回0
****************/
uint8_t CallBatAddCan1(RxFunCan1 func) {
if (CallBatRxCan1 == NULL) { //分配初始内存
CallBatRxCan1 = malloc(sizeof(CallbackStructureCan1));
if (CallBatRxCan1 == NULL) {
return 0; // 内存分配失败,返回0或错误代码
}
CallBatRxLenCan1 = 0; // 初始化大小为0(但实际上在第一次添加时会被加1)
}
CallbackStructureCan1 *temp = realloc(CallBatRxCan1, (CallBatRxLenCan1 + 1) * sizeof(CallbackStructureCan1));// 为回调表分配更多内存
if (temp == NULL) {
return 0; // realloc失败,返回0或错误代码
}
CallBatRxCan1 = temp;
CallBatRxCan1[CallBatRxLenCan1].fun = func; // 添加回调并更新大小
CallBatRxLenCan1++;
return CallBatRxLenCan1; // 返回回调的ID(索引+1)
}
/****************
触发回调
****************/
static void CallRxFunCan1(_CANMSG* msg) {
for(uint8_t i=0;i < CallBatRxLenCan1;i++){ //遍历储存在变量的回调函数
if (CallBatRxCan1[i].fun != NULL ) {
CallBatRxCan1[i].fun(msg); //调用
}
}
}
//*********************Can1 */
这个是我自己弄的使用注册回调方式将消息直接回调 没有使用到延迟
但是我看了很多人的代码 大部分没有使用回调的方式这是为什么呢
|