[活动专区] 【杰发科技AC7840x测评】+ 微操作系统+CAN收/发协议栈

[复制链接]
 楼主| suncl110 发表于 2023-12-14 09:40 | 显示全部楼层 |阅读模式
<
本帖最后由 suncl110 于 2023-12-18 16:43 编辑

#申请原创# #申请开发板#     (本人自己编写的一个操作系统和CAN协议栈,十分简洁,比较适合小系统的应用)
感谢21家厚爱,由于最近比较忙,就晚些日子发此帖了。本次发帖的主要内容是介绍一下我编写的一个微小的操作系统及与之匹配的CAN收发管理的协议栈
本着开源和互相学习的精神,就分享给大家了,希望能给21IC及杰发MCU添砖加瓦。也希望各位大佬,给点赞回帖,鼓励鼓励!废话不多说了,直接上。
1.由于采用的是GCC+J-LINK方案,先要把杰发芯片型号及FLASH烧录算法加入至J-LINK
95494657a55efe4538.png 32534657a560c5cf92.png 14955657a567d3de55.png
如上图操作,算法文件我也放在最下方附件里了
2。调试参数如下图配置:
42285657a56c761bf5.png 55436657a56e38051a.png
3。再给大家介绍一个segger家出的调试软件-Ozone v3.26c,比较nice
62726657a574639f6b.png 53430657a575697a56.png
4.接下来介绍一下这个操作系统的用法,如下:
包含头文件:
#include "SwTmr.h"
#include "task.h"
在taskcfg.h里配置系统参数:
#define TASK_CNT                                    (7u)-->最多任务个数,任务中能被使用的值为0~5,第6个任务分配给了TASKIDLE.0为最高优先级

#define configCPU_CLOCK_HZ                          (120000000u)-->cpu运行的时钟
#define configTICK_RATE_HZ                          (1000u)--->系统节拍,1000表示1毫秒


定义任务参数:栈及优先级等
//----------------------------------------------------------------------------
#define TASK_LED3_PRO                (4u)
#define TASK_LED3_STACK_DEPTH        (128u)
static  uint32_t TaskLed3Stack[TASK_LED3_STACK_DEPTH];
//----------------------------------------------------------------------------
#define TASK_LED4_PRO                (1u)
#define TASK_LED4_STACK_DEPTH        (128u)
static  uint32_t TaskLed4Stack[TASK_LED4_STACK_DEPTH];
//----------------------------------------------------------------------------
#define TASK_LEDRGB_PRO                (3u)
#define TASK_LEDRGB_STACK_DEPTH        (128u)
static  uint32_t TaskLedRgbStack[TASK_LEDRGB_STACK_DEPTH];
//----------------------------------------------------------------------------
#define TASK_CAN_PRO                 (0u)
#define TASK_CAN_STACK_DEPTH         (256u)
static  uint32_t TaskCanStack[TASK_CAN_STACK_DEPTH];
/* Private functions ---------------------------------------------------------*/
在main函数里创建任务:
int main(void)
{
    SystemClock_Config();
    InitDebug();
    printf("GPIO Basic Test\r\n");

    GPIO_LedInit();
    GPIO_KeyInit();
    CanIf_Bus0Init();
//---------------------------------------------------------------------------------
        Task_CreateStatic(Task_Led3,
                                          TaskLed3Stack,
                                          TASK_LED3_STACK_DEPTH,
                                          TASK_LED3_PRO);

        Task_CreateStatic(Task_Led4,
                                          TaskLed4Stack,
                                          TASK_LED4_STACK_DEPTH,
                                          TASK_LED4_PRO);

    Task_CreateStatic(Task_LedRgb,
                      TaskLedRgbStack,
                      TASK_LEDRGB_STACK_DEPTH,
                      TASK_LEDRGB_PRO);

    Task_CreateStatic(Task_Can,
                      TaskCanStack,
                      TASK_CAN_STACK_DEPTH,
                      TASK_CAN_PRO);

//---------------------------------------------------------------------------------
        Task_StartScheduler();
        while(1u)
        {

        }
}
各任务简介:
void Task_Led3(void)//LED3每200ms闪烁一次
{
//------------------------------------
    while (1)
    {
        Task_Delay(200);
        LED3_TOGGLE;
    }
}
void Task_Led4(void)//LED4每400ms闪烁一次
{
//------------------------------------
    while (1)
    {
        Task_Delay(400);
        LED4_TOGGLE;
    }
}
void Task_LedRgb(void)//当有效按键被按下时,会向此任务发一邮件,当本任务收到邮件后,控制RGB灯变一次色
{
    uint8_t key;
//------------------------------------
    while (1)
    {
        //Task_Delay(100);
        key = (uint8_t)Task_WaitMail();
        if(0u != key)
        {   RGB_Toggle();}
    }
}

void Task_Can(void)
{
    uint32_t taskTick;
    uint8_t  key;
//------------------------------------
    taskTick = Task_GetTick();
    //CanSm_Init();   
    //UdsDsp_Init();
    //CanNm_Init();   
    CanCom_MsgInit();---->初始化CAN收发协议栈
    CanTx_Init();-------->初始化发送CAN数据及参数
    CanRx_Init();
//------------------------------------
    while (1)
    {
        key = Get_Key4Value();
        if(0u != key)
        {   Task_GiveMail(TASK_LEDRGB_PRO,(void *)key);}--------》给RGB任务发邮件
        Task_DelayUntil(&taskTick,5u);
        //CanNm_NetworkManageProcess();   
        //UdsDsp_DiagServiceProcess();
        CanCom_MsgDispatch();------------------------------------》运行CAN协议栈
        SwTmr_Dispatch();
    }
}









5。CAN协议栈简介:
CANIF.C里给将MCU的CAN数据进行抽象
static void LoadMessageExp(comMsg_s *pPar)//每帧CAN数据在发送前,进行数据加载,将所需发送的数据在此加载
{
   static uint8_t cnt=0;
//--------------------------------------------------
   pPar->msg.data[0u] = cnt++;
   pPar->msg.data[1u] = 0x34;
   pPar->msg.data[2u] = 0x56;
   pPar->msg.data[3u] = 0x78;
   pPar->msg.data[4u] = 0x9a;
   pPar->msg.data[5u] = 0xbc;
   pPar->msg.data[6u] = 0xde;
   pPar->msg.data[7u] = 0xf5;
}

void CanTx_Init(void)
{
//--------------------------------------------------
   MsgExp1.sendType = CYCLED_FRAME;----》设置为周期发送帧
   MsgExp1.sendDis = 0u;
   MsgExp1.stamp = -1000u+0u;
   MsgExp1.period = 1000u;-------------》发送周期为1秒
   MsgExp1.msg.id = 0x330u;------------》帧ID
   MsgExp1.msg.length = 8u;
   MsgExp1.preDealFunc = LoadMessageExp;-->发送数据加载函数
   (void)CanCom_MsgAdd(&MsgExp1);---------》将本帧加入发送队列
//--------------------------------------------------
   MsgExp2.sendType = CYCLED_FRAME;
   MsgExp2.sendDis = 0u;
   MsgExp2.stamp = -1000u+500u;
   MsgExp2.period = 1000u;
   MsgExp2.msg.id = 0x181EFF78u|CAN_EXTENDED_FRAME_MASK;///扩散帧实例
   MsgExp2.msg.length = 8u;
   MsgExp2.preDealFunc = LoadMessageExp;
   (void)CanCom_MsgAdd(&MsgExp2);
}
6。好了,将程序烧录进开发板:
43784657a5c3110621.png 91922657a5c3ae154e.png
祝大家玩的愉快!!!
请回帖下载源码
游客,如果您要查看本帖隐藏内容请回复





评论

如果觉得本实例好,请不吝点赞&回复,以示鼓励,谢谢!  发表于 2023-12-14 09:44
lss2008 发表于 2023-12-18 09:01 | 显示全部楼层
用微小系统实现,很不错哦

评论

多谢鼓励,有不足之处还望赐教  发表于 2023-12-18 11:18
ligen13872 发表于 2023-12-19 10:49 | 显示全部楼层
瞧瞧
dun2012 发表于 2023-12-25 14:55 | 显示全部楼层
不错不错哈,请问有源码吗?

评论

最下面就是源码  发表于 2023-12-26 07:57
MLMT 发表于 2023-12-25 17:19 | 显示全部楼层
瞅瞅
yishuizi 发表于 2023-12-27 09:58 | 显示全部楼层
不错谢谢分享啊
大灰狠 发表于 2023-12-27 23:05 | 显示全部楼层
谢谢分享,学习下
abcde4631 发表于 2024-2-17 19:23 | 显示全部楼层
感谢分享,学习学习
yinijinta 发表于 2024-3-23 11:19 | 显示全部楼层
感谢分享
jhzxzss 发表于 2024-4-17 08:39 来自手机 | 显示全部楼层
谢谢楼主分享!
eleluq 发表于 2024-5-17 13:26 | 显示全部楼层
系统实现,很不错哦,学习下
WoodData 发表于 2024-5-23 10:12 | 显示全部楼层
谢谢分享,学习下
zhumin987 发表于 2024-6-28 11:45 | 显示全部楼层
谢谢分享,学习下
yxh1933 发表于 2024-8-13 16:57 | 显示全部楼层
感谢大神分享
liangjingli 发表于 2024-8-24 16:13 | 显示全部楼层
不错的样子
eleluq 发表于 2024-10-31 21:18 | 显示全部楼层
用微小系统实现,很不错哦
修勾 发表于 2024-11-1 10:39 | 显示全部楼层
weikang1111 发表于 2024-11-1 11:46 | 显示全部楼层
点赞
doze 发表于 2024-11-6 16:48 | 显示全部楼层
很好
sblpp 发表于 2024-11-7 08:11 | 显示全部楼层
好资料,谢谢分享~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

222

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部