[活动专区]

【杰发科技AC7840x测评】+RT-Thread操作系统移植

[复制链接]
1060|2
手机看帖
扫描二维码
随时随地手机跟帖
夜声|  楼主 | 2023-12-3 17:44 | 显示全部楼层 |阅读模式
1.前言
     手上有200个左右的这个芯片,型号一样,没做开发板,正好论坛举行了这次活动申请到了这个开发板。感谢社区和杰发厂家的支持。本次基于AC78406YGLA开发板上移植RT-Thread操作系统以及finsh组件,完成后新建线程进程测试。
2.芯片简介
AC7840x是基于ARM Cortex-M4F内核的车规级MCU,于2022年上市。产品符合AEC-Q100 Grade1,功能安全符合ISO 26262 ASIL-B,信息安全符合SHE标准,支持安全启动。软件生态支持AUTOSAR MCAL4.4,可提供MCAL及配置工具。产品拥有双Bank Flash用于存储程序,支持OTA。资源如下:
1f7568a7b16371f82325204fe00d8689
3.RT-Thread简介
RT-Thread Nano 是一个极简版的硬实时内核,它是由 C 语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的 RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。
在资源足够的情况下可移植finsh组件,如下为RT-Thread软件框图:
41968bd9e331dd302015d607cf3bb99b
RT-Thread Nano 支持可裁剪,通过rtconfig.h进行,在本次使用过程中也会用到,需要裁剪一些功能。
同时最关心的就是RT-Thread Nano的使用资源情况了,对 RAM 与 ROM 的开销非常小,在支持 semaphore 和 mailbox 特性,并运行两个线程 (main 线程 + idle 线程) 情况下,ROM 和 RAM 依然保持着极小的尺寸,RAM 占用约 1K 左右,ROM 占用 4K 左右,但实际可能不止,接下来就开始RT-Thread的移植。
4.移植步骤
4.1Kernel添加
下载RT-Thread Nano内核安装包,双击安装就可以:
c109174f2082e37c2c151f06e753337c
现在打开一个官方例程,这里使用的GPIO Basic
6206da6d2a7ce1f03d4549e21a666a4e
在首届面点击RunTime Environment,进入选择RTOS,选址RT-Thread,勾选kernel
ba13e8b4834f29031f560b3d8e825b2f
接下来编译一下,根据提示去修改,编译会出现如下错误,这里是需要添加操作系统的时钟配置。
ce9257a1d33919f14c5fb8630d713741
添加操作系统心跳配置
0353fd95dcbafdc1b8ddd1f07ce514bd
接下来在board.c文件中添加滴答定时器中断处理函数。
7c5a38a7336ed57911ee76988f4ff7f6
再次编译一下,发现void SysTick_Handler()重定义,在osif_baremetal.c文件中重定义,打开osif_baremetal.c文件,并且将文件属性调整为可写,将void SysTick_Handler(void)屏蔽。
1b4f88b026a5d83fdd02ad5248cd0825
在main.c文件中,包含#include <rtthread.h>头文件,将延时函数调整为操作系统的延时函数。
bb69c7a4e5e9064d5132a11e11dc9760
下载代码,灯已经开始闪烁,操作系统已经跑起来了。
4.2Finsh控制台添加
同样在添加kernel源码的地方,添加shell,如下所示:
ea6619690a1b3ae82d0a2d8e116f3d51
先编译一下,会报错,根据报错步骤去实现需要添加的函数或者功能。如下所示,首先需要使能在配置文件中包含finsh_config.h
5e0cdf846b3db9c3f3dadbdef9d5040b
接下来继续编译,如下所示,需要添加串口接收函数。接收一个字符
b1ac06cac62a04a246d86af3cdc91991
添加字符获取函数,添加相关头文件
0209f98ecba589a565704e8e96228c23
接下来,接收设置完了,添加输出,没有是不完美的。在rtconfig.h中使能宏定义
c60ceeabc478d9e37cbe0f804efe0bdf
编译一下,根据提示进行更改。添加串口初始化,将主函数中串口初始化挪过来就行了。
3e640411ed6962dc708ac07172e0ef55
接下来添加输出字符函数,同样的需要在board.c文件中添加相应的头文件。
f66b20ee93e26f1ff0c66371cf545aad
4.3创建线程
把上面都移植完成后,创建两个线程进行演示,创建一个LED的和一个RGB的,如下所示。
/* Copyright Statement:
*
* This software/firmware and related documentation ("AutoChips Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to AutoChips Inc. and/or its licensors. Without
* the prior written permission of AutoChips inc. and/or its licensors, any
* reproduction, modification, use or disclosure of AutoChips Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
*
* AutoChips Inc. (C) 2022. All rights reserved.
*
* BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
* THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("AUTOCHIPS SOFTWARE")
* RECEIVED FROM AUTOCHIPS AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
* ON AN "AS-IS" BASIS ONLY. AUTOCHIPS EXPRESSLY DISCLAIMS ANY AND ALL
* WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
* WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
* NONINFRINGEMENT. NEITHER DOES AUTOCHIPS PROVIDE ANY WARRANTY WHATSOEVER WITH
* RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
* INCORPORATED IN, OR SUPPLIED WITH THE AUTOCHIPS SOFTWARE, AND RECEIVER AGREES
* TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
* RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
* OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN AUTOCHIPS
* SOFTWARE. AUTOCHIPS SHALL ALSO NOT BE RESPONSIBLE FOR ANY AUTOCHIPS SOFTWARE
* RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
* STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND AUTOCHIPS'S
* ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE AUTOCHIPS SOFTWARE
* RELEASED HEREUNDER WILL BE, AT AUTOCHIPS'S OPTION, TO REVISE OR REPLACE THE
* AUTOCHIPS SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
* CHARGE PAID BY RECEIVER TO AUTOCHIPS FOR SUCH AUTOCHIPS SOFTWARE AT ISSUE.
*/
/******************************************************************************
* @version: V2.0.1  AC7840x  Demo
******************************************************************************/

#include "ac7840x.h"
#include "clock_config.h"
#include "debugout_ac7840x.h"
#include <rtthread.h>
#include "gpio.h"
#include "../src/uart/uart_hw.h"

/* 定义线程控制块 */
static struct rt_thread led_thread;
/* 定义线程栈 */
static rt_uint8_t rt_led_thread_stack[1024];

/* 定义线程控制块 */
static struct rt_thread rgb_thread;
/* 定义线程栈 */
static rt_uint8_t rt_rgb_thread_stack[1024];

void SystemClock_Config(void)
{
    CKGEN_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,
                   g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);
    CKGEN_DRV_UpdateConfiguration(0, CLOCK_MANAGER_POLICY_AGREEMENT);
}


static void led_thread_entry(void* parameter)
{
    while (1)
    {
        LED3_TOGGLE;
        rt_thread_delay(500);   /* 延时500个tick */
    }
}


static void rgb_thread_entry(void* parameter)
{
    while (1)
    {
        RGB_Toggle();
                         
        rt_thread_delay(500);   /* 延时500个tick */
    }
}



int main(void)
{
                       
         rt_thread_init(&led_thread,                 /* 线程控制块 */
                "led1",                       /* 线程名字 */
                led_thread_entry,            /* 线程入口函数 */
                RT_NULL,                      /* 线程入口函数参数 */
                &rt_led_thread_stack[0],     /* 线程栈起始地址 */
                sizeof(rt_led_thread_stack), /* 线程栈大小 */
                10,                            /* 线程的优先级 */
                20);                          /* 线程时间片 */
                                                               
         rt_thread_init(&rgb_thread,                 /* 线程控制块 */
                "rgb",                       /* 线程名字 */
                rgb_thread_entry,            /* 线程入口函数 */
                RT_NULL,                      /* 线程入口函数参数 */
                &rt_rgb_thread_stack[0],     /* 线程栈起始地址 */
                sizeof(rt_rgb_thread_stack), /* 线程栈大小 */
                11,                            /* 线程的优先级 */
                20);                          /* 线程时间片 */                                               
    rt_thread_startup(&led_thread);             /* 启动线程,开启调度 */
                rt_thread_startup(&rgb_thread);             /* 启动线程,开启调度 */                                               


}
4.4 演示
演示.gif
5.总结
本次完成RT-Thread操作系统的移植,实现了线程的创建,同时操作操作系统正常运行,添加了finsh组件。总体下来的感觉资料还是挺完善的,有入门手册,每个外设都有笔记,同时这款芯片也支持点击驱动,后面可以往这方面研究。

使用特权

评论回复

相关帖子

lulugl| | 2023-12-4 07:24 | 显示全部楼层
是移植rtt-nano吧,大佬有没有空移植一下标准版,我们学习一下呀。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

26

主题

84

帖子

2

粉丝