首页 > 编程语言 >RTX5/FreeRTOS全家桶源码工程综合实战模板集成CANopen组件(2024-10-30)

RTX5/FreeRTOS全家桶源码工程综合实战模板集成CANopen组件(2024-10-30)

时间:2024-11-01 16:21:04浏览次数:6  
标签:CO FreeRTOS CANopen CMSIS 30 MODULE while 源码 define

【前言】

之前的视频教程分享了两期CANopen的专题,配套的例子都是基于裸机的,为了方便大家在OS下使用,本期视频带OS下的支持。

CANopen协议栈专题,实战方式系统了解NMT,PDO,SDO,时间戳,同步报文,紧急报文等(2023-10-17)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=121438

CANopen协议栈专题,CANopen主从机组网实战,CAN词典工具使用方法以及吃透PDO玩法(2023-11-01)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=121619

【视频】

https://www.bilibili.com/video/BV1zHSaYQEYx/


【简介】

1、针对RTX5/FreeRTOS源码全家桶模板,已经更新了4期视频,这是第5期,来一期添加CANopen组件的视频教程。

第1期:RTX5全家桶源码综合模板发布,含FreeRTOS内核版本,将其打造成直接面向实际项目应用的综合框架
https://www.armbbs.cn/forum.php?mod=viewthread&tid=124516

第2期:RTX5源码全家桶集成emWin6.40,  Modbus主从,含FreeRTOS版, 探讨一种移植第3方组件通用方法以及使用注意事项
https://www.armbbs.cn/forum.php?mod=viewthread&tid=125509

第3期:手把手AppWizard轻松制作一个emWin滑动主界面控制框架,任意跳转控制(2024-09-06)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=125613

第4期:【授人以渔】CMSIS-RTOS V2封装层专题视频,一期视频将常用配置和用法梳理清楚,适用于RTX5和FreeRTOS(2024-09-28)
https://www.armbbs.cn/forum.php?mod=viewthread&tid=125907


2、CANopen常用的NMT,PDO,SDO,时间戳,同步报文,紧急报文都支持


3、移植CANopenNode协议栈到RTOS两个关键地方的处理

(1)开关中断的处理,裸机版的移植在开关中断的处理地方非常"暴力",直接就是大范围的全局开关中断处理,非常不合理

 

/* (un)lock critical section in CO_CANsend() */
#define CO_LOCK_CAN_SEND(CAN_MODULE)                                                                                   \
    do {                                                                                                               \
        (CAN_MODULE)->primask_send = __get_PRIMASK();                                                                  \
        __disable_irq();                                                                                               \
    } while (0)
#define CO_UNLOCK_CAN_SEND(CAN_MODULE) __set_PRIMASK((CAN_MODULE)->primask_send)
 
/* (un)lock critical section in CO_errorReport() or CO_errorReset() */
#define CO_LOCK_EMCY(CAN_MODULE)                                                                                       \
    do {                                                                                                               \
        (CAN_MODULE)->primask_emcy = __get_PRIMASK();                                                                  \
        __disable_irq();                                                                                               \
    } while (0)
#define CO_UNLOCK_EMCY(CAN_MODULE) __set_PRIMASK((CAN_MODULE)->primask_emcy)
 
/* (un)lock critical section when accessing Object Dictionary */
#define CO_LOCK_OD(CAN_MODULE)                                                                                         \
    do {                                                                                                               \
        (CAN_MODULE)->primask_od = __get_PRIMASK();                                                                    \
        __disable_irq();                                                                                               \
    } while (0)
#define CO_UNLOCK_OD(CAN_MODULE) __set_PRIMASK((CAN_MODULE)->primask_od)

 

canopen_app_interrupt(void) {
    CO_LOCK_OD(CO->CANmodule);
    if (!CO->nodeIdUnconfigured && CO->CANmodule->CANnormal) {
        bool_t syncWas = false;
        /* get time difference since last function call */
        uint32_t timeDifference_us = 1000; // 1ms second
 
#if (CO_CONFIG_SYNC) & CO_CONFIG_SYNC_ENABLE
        syncWas = CO_process_SYNC(CO, timeDifference_us, NULL);
#endif
#if (CO_CONFIG_PDO) & CO_CONFIG_RPDO_ENABLE
        CO_process_RPDO(CO, syncWas, timeDifference_us, NULL);
#endif
#if (CO_CONFIG_PDO) & CO_CONFIG_TPDO_ENABLE
        CO_process_TPDO(CO, syncWas, timeDifference_us, NULL);
#endif
 
        /* Further I/O or nonblocking application code may go here. */
    }
    CO_UNLOCK_OD(CO->CANmodule);
}

现在修改为采用仅开关CAN中断,且支持嵌套调用

/* (un)lock critical section in CO_CANsend() */
#define CO_LOCK_CAN_SEND(CAN_MODULE)                                                                   \
    do {                                                                                               \
                HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);                                                               \
        (CAN_MODULE)->CriticalNesting++;                                                               \
    } while(0)
#define CO_UNLOCK_CAN_SEND(CAN_MODULE)                                                                 \
    do {                                                                                               \
                (CAN_MODULE)->CriticalNesting--;                                                                \
                if((CAN_MODULE)->CriticalNesting == 0)                                                         \
                {                                                                                              \
                  HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);                                                               \
                }                                                                                              \
    } while(0)        
 
/* (un)lock critical section in CO_errorReport() or CO_errorReset() */
#define CO_LOCK_EMCY(CAN_MODULE)                                                                       \
    do {                                                                                               \
                HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);                                                               \
        (CAN_MODULE)->CriticalNesting++;                                                               \
    } while(0)
#define CO_UNLOCK_EMCY(CAN_MODULE)                                                                     \
            do {                                                                                           \
                (CAN_MODULE)->CriticalNesting--;                                                               \
                if((CAN_MODULE)->CriticalNesting == 0)                                                         \
                {                                                                                              \
                  HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);                                                               \
                }                                                                                              \
    } while(0)        
 
/* (un)lock critical section when accessing Object Dictionary */
#define CO_LOCK_OD(CAN_MODULE)                                                                         \
    do {                                                                                               \
                HAL_NVIC_DisableIRQ(FDCAN1_IT0_IRQn);                                                               \
        (CAN_MODULE)->CriticalNesting++;                                                               \
    } while (0)
#define CO_UNLOCK_OD(CAN_MODULE)                                                                       \
         do {                                                                                              \
                (CAN_MODULE)->CriticalNesting--;                                                                \
                if((CAN_MODULE)->CriticalNesting == 0)                                                         \
                {                                                                                              \
                  HAL_NVIC_EnableIRQ(FDCAN1_IT0_IRQn);                                                               \
                }                                                                                              \
    } while(0)
 
#endif

(2)函数canopen_app_process和canopen_app_interrupt的调用处理,我们这里直接将其放在1ms执行一次的任务里面:

 

/*
*********************************************************************************************************
*        函 数 名: AppTaskCANopen
*        功能说明: CANopen处理任务。
*        形    参: 无
*        返 回 值: 无
*   优 先 级: osPriorityNormal6  
*********************************************************************************************************
*/
extern void DemoCANFD(void);
void AppTaskCANopen(void *argument)
{
        const uint16_t usFrequency = 1; /* 延迟周期 */
        uint32_t tick;
         
        DemoCANFD();
 
        /* 获取当前时间 */
        tick = osKernelGetTickCount(); 
         
    while(1)
    {
                /* CAN处理 */
                canopen_app_process(); 
                canopen_app_interrupt();
                 
                /* 相对延迟 */
                tick += usFrequency;                          
                osDelayUntil(tick);
    }
}

工程目录

1、集成了CMSIS6.10,CMSIS-Driver,CMSIS-DSP,CMSIS-Viwer,CMSIS-Compiler,CMSIS-RTOS V2,CMSIS-FreeRTOS,CMSIS-RTX,CMSIS-MbedTLS等,全部采用的当前最新版。
2、网络协议栈,单网络协议栈同时管理DM9000和DM9162双网口。
3、文件系统,同时管理外挂U盘,NAND Flash和SD卡。
4、USB协议栈,RL-USB同时外挂USB FS和USB HS两个USB外设,USB FS接口用于外接电脑,实现SD卡和NAND模拟U盘,USB HS用于外挂U盘设备。
5、加密算法库使用的CMSIS-mbedTLS。
6、BSP外设驱动,部分是采用的CMSIS-Driver,其他都采用我们自己设计的。
7、Modbus  RTU主从。
8、emWin6.46。
9、CANopen。


注意事项

使用的CANFD1,注意V7开发板上的跳线帽设置。另外就是如果使用了CANFD1引脚后,不能再使用MicroUSB的Device端口了


参考资料

1、案例下载,本次功能升级将emWin升级到最新的6.46版本。

FreeRTOS All In One(2024-10-30 V3.0).7z (30.53MB)

RTX5 All In One(2024-10-30 V3.0).7z (29.38MB)

2、RTX5全家桶源码综合模板发布V2.0,含FreeRTOS内核版本,将其打造成直接面向实际项目应用的综合框架(2024-08-30)

https://www.armbbs.cn/forum.php?mod=viewthread&tid=124516

3、H7-TOOL的CAN/CANFD助手CANopen协议解析操作说明V1.1,持续更新(2023-12-04)

https://www.armbbs.cn/forum.php?mod=viewthread&tid=120863

标签:CO,FreeRTOS,CANopen,CMSIS,30,MODULE,while,源码,define
From: https://www.cnblogs.com/armfly/p/18520520

相关文章

  • (附源码)基于WEB的家乡特色农商品仓库管理系统的设计与实现-计算机毕设 26145
    基于WEB的家乡特色农商品仓库管理系统的设计与实现摘 要本论文旨在设计和实现基于WEB和SSM(Spring+SpringMVC+MyBatis)的家乡特色农商品仓库管理系统,以提高农产品仓储管理效率和服务水平。论文首先分析了传统农仓库信息管理存在的问题和需求,包括信息化程度低、管理效率不......
  • 实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)
    注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路如有侵犯,请联系作者下架某盾的增强版滑块已经上线很久了,最近心血来潮想看一下这个验证码是骡子是马,我也翻阅了很多市面上的教程,都对该验证码有一定的简介,部分还停留在理论层面,本文将从浅到深......
  • 数字人直播带货前景曝光!手把手教你获取高质量系统源码!
    随着数字人直播技术的应用频率不断升高,它所蕴含着的市场前景和收益潜力也开始逐渐显现,使得不少人都对它在带货方面的效果产生好奇,并纷纷开始打听起了与数字人直播带货前景以及操作方式相关的消息。其中,就数字人直播带货的前景来说,根据iiMediaResearch发布的《2024年中国虚拟......
  • 头部公司nfc碰一碰支付系统私有化部署实力曝光!手把手教你获得高质量源码!
    随着支付宝基于NFC技术的碰一碰支付方式上线,不少商业嗅觉灵敏的人都开始察觉到它背后所蕴含着的巨大市场前景和收益潜力,从而纷纷打听起了入局相关的事宜。在此背景下,作为两大入局方式之一的nfc碰一碰支付系统私有化部署也逐渐成为了人们所重点关注的对象。毕竟,相较于代理模式......
  • 【附源码+论文+ppt+部署教程】基于SpringBoot的网上订餐系统
    本系统(程序+源码+数据库+调试部署+开发环境)带文档lw万字以上,源码已上传。点击文末名片获取个性化定制服务  摘 要随着我国经济的飞速发展,人们的生活速度明显加快,在餐厅吃饭排队的情况到处可见,近年来由于新兴IT行业的空前发展,它与传统餐饮行业也进行了新旧的结合,......
  • 题解 洛谷 Luogu P1308 [NOIP2011 普及组] 统计单词数 C++
    题目传送门:P1308[NOIP2011普及组]统计单词数-洛谷|计算机科学教育新生态https://www.luogu.com.cn/problem/P1308getline() 会清除使当次getline() 终止的换行,而cin 不会因此cin 以换行终止,之后还需要getline()的话,需要用getchar() 吞换行Linux的一些相......
  • 资源利用率提高30%,揭秘华为云Serverless高效、高密度调度优化原理
    KeyTakeawaysUSENIXATC(USENIXAnnualTechnicalConference)是计算机系统领域国际顶级学术会议之一(CCF-A),在国际上享有极高的学术声誉,2024年录用率仅为15.8%。来自华为云中间件团队、上海交通大学IPADS实验室的论文《HarmonizingEfficiencyandPracticability:Optimizing......
  • ORB-SLAM2源码学习:ORBextractor.cc:IC_Angle 利用灰度质心法求解关键点方向角
    ORB特征点:特征点是由关键点和描述子两部分组成,关键点是指特征点在图像中的位置,描述子是用来描述关键点周围的像素信息。ORB关键点是在FAST关键点的基础上进行改进给像素增加了一个主方向,称为OrientedFAST。描述子在BRIEF的基础上加入了上述的方向信息,称为SteeredBRIEF。FAS......
  • (附源码)基于Spring Boot的英语学习网站的设计与实现-计算机毕设 28248
    基于SpringBoot的英语学习网站的设计与实现摘要在当今全球化的时代,英语已经成为了国际交流的通用语言。为了提高英语水平,越来越多的人选择在线学习英语。然而,传统的英语学习网站往往存在功能单一、交互性差、用户体验不佳等问题。为了解决这些问题,我们提出了基于SpringB......
  • 【1】Elasticsearch 30分钟快速入门
    文章目录一、Elasticsearch基本概念及工作原理(一)基本概念(二)工作原理二、Elasticsearch原生RESTful方式的增删改查(一)创建索引(二)插入文档(三)查询文档(四)更新文档(五)删除文档(六)删除索引三、PythonSDK实现增删改查(一)安装ElasticsearchPythonSD......