1104|2

7044

帖子

11

TA的资源

版主

楼主
 

【CW32L052测评】 纯手工移植rt-thread nano [复制链接]

 
  1. 准备cw32l083 printf的工程包一个。
  2. 准备RTthread nano工程源码。(可以复制一份mdk下的源码)也可以去官网下载一份:

  1.  在官方的固件库下面新建RT_Thread文件夹,用于存放rtt的源码:

  1. 拷贝源码下的 include、libcpu、src到RT_Threa文件夹下面

5. libcpu文件夹只保留arm/cortexm0这个文件夹,其他的都删除,包括riscv文件夹。

6. 打开example的下面的UART_Printf工程:

 

 7.  在分组中新建rtt/src分组,把RT_Thread/src下面的文件全部添加进来

8、新建rtt/libcpu把\RT_Thread\libcpu\arm\cortex-m0下面的cpuport.c\context_rvds.S添回进来。

9、添加头文件路径  \RT_Thread\include到工程中:

10、在user下面新建board.c,并把他加入到user组里面:内容如下:

/*
 * Copyright (c) 2006-2019, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-05-24                  the first version
 */

#include <rthw.h>
#include <rtthread.h>
#include "main.h"

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
 * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
 * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
 */
#define RT_HEAP_SIZE (2*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];

RT_WEAK void *rt_heap_begin_get(void)
{
    return rt_heap;
}

RT_WEAK void *rt_heap_end_get(void)
{
    return rt_heap + RT_HEAP_SIZE;
}
#endif

void rt_os_tick_callback(void)
{
    rt_interrupt_enter();
    
    rt_tick_increase();

    rt_interrupt_leave();
}

void SysTick_Handler(void)
{
	rt_os_tick_callback();
}

/**
 * This function will initial your board.
 */
void rt_hw_board_init(void)
{
	SysTick_Config(SystemCoreClock/1000);
//#error "TODO 1: OS Tick Configuration."
    /* 
     * TODO 1: OS Tick Configuration
     * Enable the hardware timer and call the rt_os_tick_callback function
     * periodically with the frequency RT_TICK_PER_SECOND. 
     */

    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

#ifdef RT_USING_CONSOLE

static int uart_init(void)
{
#error "TODO 2: Enable the hardware uart and config baudrate."
    return 0;
}
INIT_BOARD_EXPORT(uart_init);

void rt_hw_console_output(const char *str)
{
#error "TODO 3: Output the string 'str' through the uart."
}

#endif

 

11. 新建在user文件夹下新建rtconfig.h,内容如下:

/* RT-Thread config file */

#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__

// <<< Use Configuration Wizard in Context Menu >>>

// <h>Basic Configuration
// <o>Maximal level of thread priority <8-256>
//  <i>Default: 32
#define RT_THREAD_PRIORITY_MAX  32
// <o>OS tick per second
//  <i>Default: 1000   (1ms)
#define RT_TICK_PER_SECOND  1000
// <o>Alignment size for CPU architecture data access
//  <i>Default: 4
#define RT_ALIGN_SIZE   4
// <o>the max length of object name<2-16>
//  <i>Default: 8
#define RT_NAME_MAX    8
// <c1>Using RT-Thread components initialization
//  <i>Using RT-Thread components initialization
#define RT_USING_COMPONENTS_INIT
// </c>

#define RT_USING_USER_MAIN

// <o>the stack size of main thread<1-4086>
//  <i>Default: 512
#define RT_MAIN_THREAD_STACK_SIZE     256

// </h>

// <h>Debug Configuration
// <c1>enable kernel debug configuration
//  <i>Default: enable kernel debug configuration
//#define RT_DEBUG
// </c>
// <o>enable components initialization debug configuration<0-1>
//  <i>Default: 0
#define RT_DEBUG_INIT 0
// <c1>thread stack over flow detect
//  <i> Diable Thread stack over flow detect
//#define RT_USING_OVERFLOW_CHECK
// </c>
// </h>

// <h>Hook Configuration
// <c1>using hook
//  <i>using hook
//#define RT_USING_HOOK
// </c>
// <c1>using idle hook
//  <i>using idle hook
//#define RT_USING_IDLE_HOOK
// </c>
// </h>

// <e>Software timers Configuration
// <i> Enables user timers
#define RT_USING_TIMER_SOFT         0
#if RT_USING_TIMER_SOFT == 0
    #undef RT_USING_TIMER_SOFT
#endif
// <o>The priority level of timer thread <0-31>
//  <i>Default: 4
#define RT_TIMER_THREAD_PRIO        4
// <o>The stack size of timer thread <0-8192>
//  <i>Default: 512
#define RT_TIMER_THREAD_STACK_SIZE  512
// </e>

// <h>IPC(Inter-process communication) Configuration
// <c1>Using Semaphore
//  <i>Using Semaphore
#define RT_USING_SEMAPHORE
// </c>
// <c1>Using Mutex
//  <i>Using Mutex
//#define RT_USING_MUTEX
// </c>
// <c1>Using Event
//  <i>Using Event
//#define RT_USING_EVENT
// </c>
// <c1>Using MailBox
//  <i>Using MailBox
#define RT_USING_MAILBOX
// </c>
// <c1>Using Message Queue
//  <i>Using Message Queue
//#define RT_USING_MESSAGEQUEUE
// </c>
// </h>

// <h>Memory Management Configuration
// <c1>Memory Pool Management
//  <i>Memory Pool Management
//#define RT_USING_MEMPOOL
// </c>
// <c1>Dynamic Heap Management(Algorithm: small memory )
//  <i>Dynamic Heap Management
//#define RT_USING_HEAP
//#define RT_USING_SMALL_MEM
// </c>
// <c1>using tiny size of memory
//  <i>using tiny size of memory
//#define RT_USING_TINY_SIZE
// </c>
// </h>

// <h>Console Configuration
// <c1>Using console
//  <i>Using console
//#define RT_USING_CONSOLE
// </c>
// <o>the buffer size of console <1-1024>
//  <i>the buffer size of console
//  <i>Default: 128  (128Byte)
#define RT_CONSOLEBUF_SIZE          256
// </h>

// <h>FinSH Configuration
// <c1>include finsh config
//  <i>Select this choice if you using FinSH 
//#include "finsh_config.h"
// </c>
// </h>

// <h>Device Configuration
// <c1>using device framework
//  <i>using device framework
//#define RT_USING_DEVICE
// </c>
// </h>

// <<< end of configuration section >>>

#endif

12、屏蔽interrupts_cw32050.c中的HardFault_Handler以及PendSV_Handler函数。

编译结果为无错误无警告:

  13、编写main中的测试函数如下:

struct rt_thread thread1;
struct rt_thread thread2;

char thread1_stack[512];
char thread2_stack[512];

void led_init(void)
{
	  GPIO_InitTypeDef GPIO_InitStruct = {0};

    RCC_HSI_Enable(RCC_HSIOSC_DIV6);
    __RCC_GPIOC_CLK_ENABLE();
		__RCC_GPIOA_CLK_ENABLE();
    GPIO_InitStruct.IT = GPIO_IT_NONE;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pins = GPIO_PIN_10;

    GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
		
		GPIO_InitStruct.Pins = GPIO_PIN_15;
		GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
}

void thread1_entry(void*param)
{

	while (1)
	{
	//printf("thread1 is runningrn\r\n");
		GPIO_TogglePin(CW_GPIOC, GPIO_PIN_10);
		rt_thread_mdelay(1000);
	}

}

void thread2_entry(void*param)
{

while (1)
{
	GPIO_TogglePin(CW_GPIOA, GPIO_PIN_15);
	rt_thread_mdelay(500);
}

}

void thread1_init(void)
{

	rt_err_t fd=rt_thread_init(&thread1,"thread1",&thread1_entry,0,&thread1_stack[0],sizeof(thread1_stack),10,10);
	if(fd < 0)
	{
	printf("thread2 init is fail \r\n");
	}
	rt_thread_startup(&thread1);
}
void thread2_init(void)
{

	rt_err_t fd=rt_thread_init(&thread2,"thread2",&thread2_entry,0,&thread2_stack[0],sizeof(thread2_stack),10,10);
	if(fd < 0)
	{
	printf("thread2 init is fail \r\n");
	}
	rt_thread_startup(&thread2);
}
int32_t main(void)
{
    //配置RCC
    RCC_Configuration();

    //配置GPIO
    GPIO_Configuration();

    //配置UART
    UART_Configuration();
		led_init();
    printf("\r\nCW32L052 UART Printf Example\r\n");
		thread1_init();
		thread2_init();
    while(1)
    {

    }
}

下载后测试效果为LED1与LED2按0.5秒与1秒的闪灯,两个任务成功运行:

rtt

 

最新回复

你这确实是纯手工移植,不是从Keil中导入的。   详情 回复 发表于 2023-7-20 18:36
点赞 关注
 
 

回复
举报

7244

帖子

2

TA的资源

版主

沙发
 

你这确实是纯手工移植,不是从Keil中导入的。

点评

手工移植,更能体验到移植的原理,就是board.c跟rtconfig没有做特别的介绍,少了一些什么。  详情 回复 发表于 2023-7-20 21:54
 
 
 

回复

7044

帖子

11

TA的资源

版主

板凳
 
wangerxian 发表于 2023-7-20 18:36 你这确实是纯手工移植,不是从Keil中导入的。

手工移植,更能体验到移植的原理,就是board.c跟rtconfig没有做特别的介绍,少了一些什么。

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表