当前位置: 首页 > news >正文

网站建设 武讯科技林州市住房和城乡建设部网站

网站建设 武讯科技,林州市住房和城乡建设部网站,有网站代码怎么做网站,制作wordpress文章列表页本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:吴金刚 0.前言 首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。 板子做的虽然简约,但是自带了GD-link所以一根USB…

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:吴金刚

0.前言

首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。

板子做的虽然简约,但是自带了GD-link所以一根USB线既实现了供电又实现了下载调试,必须赞一个, 而且还支持FS-USB和HS-USB两个USB接口,测试USB就更方便了。GD的单片机我并不陌生,目前也一直在用GD32F10x系列做产品,所以拿到板子后很快就能上手,下面就基于这块试用板介绍一下实时操作系统RTX5的移植过程。

说起RTX实时操作系统,相信使用过Keil-MDK环境的人都知道,它最开始是和Keil-MDK绑定在一起的,在Keil-MDK可以很方便的使用,几乎不需要过多移植工作,就能让系统跑起来,使用非常方便。后来随着CMSIS软件包的独立和开源,RTX就成为了CMSIS软件包的一部分,并且ARM还给RTX套了一层壳叫RTOS(RTOS2),这是一个基于Cortex-M处理器的通用RTOS接口,通过这层接口可以快速方便的切换不同的实时操作系统,目前除了支持RTX5还支持FreeRTOS。

RTX5的主要特点:

  1. 开源免费,Apache2.0授权,几乎随意商用;
  2. 任务调度方式灵活多样,支持时间片,抢占式和合作式调度;
  3. 零中断延迟,这里的零中断延迟是指ISR的中断相应时间和没有使用

RTX5系统是一样的,也就是说用于Cortex-M3/M4/M7的RTX5内核库中没有关闭中断的操作,这点应该算是RTX5一个很大的优势,像Ucos-II,Ucos-III和FreeRTOS内核的很多地方关中断操作,关中断操作对实时性有哪些危害呢?比如此时某个任务正在调用系统API函数,而且此时中断正好关闭了,也就是进入到了临界区中,这个时候如果有一个紧急的中断事件被触发,这个中断就不能得到及时执行,必须等到中断开启才可以得到执行,如果关中断时间超过了紧急中断能够容忍的限度,危害是可想而知的。

  1. 确定性,指在在定义的时间内处理事件和中断,RTX5 提供完全确定性的行为,这意味着在预定义时间内(期限)处理事件和中断,这个主要得益于RTX5的零中断延迟特性。

1.准备

因为Keil-MDK对RTX5支持的很好, 移植也很方便这里就不详细说明,有兴趣的可以参考安富莱电子的《RTX5内核教程》,里面对RTX5的详细系统特性和在Keil-MDK中使用调试方法介绍。我这里主要介绍在IAR环境中的移植和简单使用。除了准备好GD32F427开发板还需做以下准备:

  1. IAR开发环境,版本要使用7.4以上版本,我这里使用的版本是8.40.2;
  2. IAR_GD32F4xx_ADDON.3.0.0.exe IAR 环境补丁,下载地址:https://gd32mcu.com/download/…
  3. GD32开发板的官方例程GD32F4xx_Demo_Suites,https://gd32mcu.com/download/…
  4. RTX5源码,https://github.com/ARM-softwa…
    只需要用到/CMSIS/RTOS2目录内的文件。

2.移植

2.1 安装IAR环境补丁

直接运行IAR_GD32F4xx_ADDON.3.0.0.exe,目录会自动选择IAR所在的目录,注意如果电脑上安装了多个版本的IAR需要确定使用版本和安装目录一致。安装成功后可以连接开发板打开官方例程中的例程验证一下,如果例程能够正常跑起来就说明已经安装成功了。

2.2 添加RTX5文件

这里我基于GD32427V_START_Demo_Suites\Projects\03_EXTI_Key_Interrupt_mode这个例程来添加RTX5操作系统文件,首先把RTX源码目录放到GD32F4xx_Demo_Suites_V2.6.1\GD32F4xx_Firmware_Library中,在IAR工程目录中新建一个RTOS2文件夹,然后把以下文件添加到工程中:
\RTOS2\RTX\Source\IAR\irq_armv7m.s
\RTOS2\Source\os_systick.c
\RTOS2\RTX\Config\RTX_Config.c
\RTOS2\Config\RTX_Config.h
\RTOS2\RTX\Source\rtx_delay.c
\RTOS2\RTX\Source\rtx_evflags.c
\RTOS2\RTX\Source\rtx_evr.c
\RTOS2\RTX\Source\rtx_kernel.c
\RTOS2\RTX\Source\rtx_lib.c
\RTOS2\RTX\Source\rtx_memory.c
\RTOS2\RTX\Source\rtx_mempool.c
\RTOS2\RTX\Source\rtx_msgqueue.c
\RTOS2\RTX\Source\rtx_mutex.c
\RTOS2\RTX\Source\rtx_semaphore.c
\RTOS2\RTX\Source\rtx_system.c
\RTOS2\RTX\Source\rtx_thread.c
\RTOS2\RTX\Source\rtx_timer.c

2.3 工程配置

工程选项中增加路径和宏定义

2.4 RTX5简单配置和增加移植代码

由于RTX5内核使用了SVC_Handler、PendSV_Handler和SysTick_Handler这三个系统中断所以要把gd32f4xx_it.c中的中断函数删掉,需要注意的是开发板中的毫秒延时是基于SysTick_Handler的,所以需要重新开启一个新的定时器中断或者使用软件延时解决,这里我直接使用了软件延时,代码如下:

/** * [delay_1us]* @Brief   微秒延时, 软件阻塞延时, 精度稍差, 主要用于系统运行前外设初始化中延时操作* @Param   count 微秒*/
void delay_1us(uint32_t count)
{count *= 50u;while(--count);
}/** * [delay_1ms]* @Brief   毫秒延时, 软件阻塞延时, 精度稍差, 主要用于系统运行前外设初始化中延时操作* @Param   count 毫秒*/
void delay_1ms(uint32_t count)
{while(--count){delay_1us(1000u);}
}

RTX5的配置文件是RTX_Config.h, 这里简单介绍以下几个宏的配置,其他的根据需要设定或者保持默认就可以了。

OS_DYNAMIC_MEM_SIZE: 全局动态内存大小,RTX5支持动态创建系统组件(线程,信号量,消息队列等等),这些内存开销都来自这里,默认为32768Byte;
OS_TICK_FREQ: 内核嘀嗒频率, 默认1000Hz;
OS_ROBIN_ENABLE: 是否使能时间片调度,1表示使用时间片调度;
OS_ROBIN_TIMEOUT: 定义线程时间片线程切换超时的滴答数;

增加以下两个线程名的宏定义,这是RTX5的两个系统线程:

/* OS定时器线程的名称 */
#define OS_TIMER_THREAD_NAME         "threadTimer"/* 空闲线程的名称 */
#define OS_IDLE_THREAD_NAME         "threadIdle"

测试思路:系统启动后创Start线程,这个线程主要打印当前正在运行的线程数量和线程名称,user按键中断中发送线程标志到启动线程,启动线程检测到标志后创建或者删除User线程;

首先在main中初始化内核并创建启动线程:

/*!\brief      main function\param[in]  none\param[out] none\retval     none
*/
int main(void)
{/* enable the LEDs GPIO clock */rcu_periph_clock_enable(RCU_GPIOC);/* configure LED2 GPIO port */gpio_mode_set(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, GPIO_PIN_6);gpio_output_options_set(GPIOC, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6);/* reset LED2 GPIO pin */gpio_bit_reset(GPIOC, GPIO_PIN_6);/* flash the LED for test */led_flash(1);/* enable the key clock */rcu_periph_clock_enable(RCU_GPIOA);rcu_periph_clock_enable(RCU_SYSCFG);/* configure key pin as input */gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);/* enable and set key EXTI interrupt to the lowest priority */nvic_irq_enable(EXTI0_IRQn, 2U, 0U);/* connect key EXTI line to key GPIO pin */syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);/* configure key EXTI line */exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);exti_interrupt_flag_clear(EXTI_0);osKernelInitialize();    /* RTOS内核初始化 *//* 创建启动线程 */threadIdStart = osThreadNew(TaskStart, NULL, &threadAttrStart); osKernelStart();    /* 开启多线程运行RTOS *//* 不应该运行到这里 */SysPrintf("system error!\n");while(1);
}

修改gd32f4xx_it.c中的按键中断服务函数:

/*!\brief      this function handles external lines 0 interrupt request\param[in]  none\param[out] none\retval     none
*/
void EXTI0_IRQHandler(void)
{if(RESET != exti_interrupt_flag_get(EXTI_0)){/* 向启动线程发动线程标志1 */osThreadFlagsSet(threadIdStart, 1);/* 清中断标志 */exti_interrupt_flag_clear(EXTI_0);}
}

线程任务的实现:

//debug 输出到IAR的Terminal, IAR必须设置为半主机模式, 另外必须取消fputc函数的重定义
#define SysPrintf(fmt, ...) printf(fmt, ##__VA_ARGS__)
//#define SysPrintf(fmt, ...) osThreadId_t threadIdStart = NULL;    //启动线程
osThreadId_t threadIdUser = NULL;    //用户线程//启动线程参数
const osThreadAttr_t threadAttrStart = 
{.name = "threadStart",                /* 线程名称 */.attr_bits = osThreadDetached,         /* 线程属性 */.priority = osPriorityLow,            /* 线程优先级 */.stack_size = 1024,                    /* 线程栈大小,如果不指定则按照默认值设置  */
};//用户线程参数
const osThreadAttr_t threadAttrUser = 
{.name = "threadUser",                /* 线程名称 */.attr_bits = osThreadDetached,         /* 线程属性 */.priority = osPriorityHigh,            /* 线程优先级 */.stack_size = 1024,                    /* 线程栈大小,如果不指定则按照默认值设置  */
};/** * [TaskUser]* @Brief   按键控制的用户线程, 目前只实现LED闪烁* @Param   argument $argument$*/
void TaskUser(void *argument)
{for(;;){/* turn on the LED */gpio_bit_set(GPIOC, GPIO_PIN_6);osDelay(500);/* turn off the LED */gpio_bit_reset(GPIOC, GPIO_PIN_6);osDelay(500);}
}/** * [TaskStart]* @Brief   启动线程, 这里创建系统功能线程和初始定时器* @Param   argument $argument$*/
void TaskStart(void *argument)
{osThreadId_t osIdArr[10];int osThreadNum;int flgComm = 0;SysPrintf(">>>>> 基于GD32F427V-START移植RTX5测试demo <<<<<\n\n", osThreadNum);for(;;){    /* 检索线程 */osThreadNum = osThreadEnumerate(osIdArr, 10);/* 打印当前的线程个数 */SysPrintf("线程个数: %d\n-------------------------\n", osThreadNum);/* 打印线程名 */for(--osThreadNum; osThreadNum>=0; osThreadNum--){SysPrintf("%d线程名: %s \n", osThreadNum, osThreadGetName(osIdArr[osThreadNum]));    }SysPrintf("\n");/* 等待按键的标志组,1秒超时 */flgComm = osThreadFlagsWait(1, osFlagsWaitAny, 1000u);if(1 == flgComm){/* 测试线程的创建和终止 */if(threadIdUser != NULL){/* 删除用户线程 */osThreadTerminate(threadIdUser);threadIdUser = NULL;}else{/* 创建用户线程 */threadIdUser = osThreadNew(TaskUser, NULL, &threadAttrUser); }        }}
}

3.测试

下载程序, 打开IAR的Terminal I/O并运行程序,然后系统打印出当前的线程个数为3,并输出线程名称。第一次按下User按键User线程被创建,线程数为4。第二次按下User键,User线程被删除此时线程个数恢复到3。

至此RTX5的移植和简单测试就完成了,欢迎各位批评指正。现将测试包分享给各位(附件下载作为备份):
链接:https://pan.baidu.com/s/14IKYivC53SrxV7ZpM2EMDQ
提取码:2mv0

http://www.yayakq.cn/news/397347/

相关文章:

  • 广州优化网站排名wordpress python导入数据库
  • 如何建设高等数学课程网站做一个网上商城需要多少钱
  • 网站开发 营业执照多语言外贸网站源码
  • 网站建立的优点安微网站建设
  • 建设银行的网站宜昌 公司 网站建设
  • 网上哪个网站做的系统好用企业logo图片
  • python 网站开发入门wordpress如何添加注册登录界面
  • 江苏财经职业技术学院会计系示范校建设专题网站查询企业的网站有哪些
  • 湖北网站推广公司渠道做某健身房网站的设计与实现
  • 网站建设张家港网站建设 wix
  • 上海最专业的网站设计制中核二三劳务公司招聘
  • 岳阳网站开发报价龙泉建设局网站
  • 做的网站客户拿去维违法长沙网红打卡景点
  • 江西建网站聊城市网站制作
  • 杭州搭建网站军事最新新闻播报
  • 公司内部网站如何备案营销网络布局
  • 成都诗和远方网站建设wordpress怎么汉化
  • c asp.net 发布网站平面图网站
  • 做网站找哪家又便宜又好哪个网站可以做专业兼职
  • 做的网站太大怎么办请输入搜索关键词
  • 网站建设需要什么条件安庆市网站建设
  • 佛山市企业网站seo报价网站 打赏功能
  • 网站地址英文温州网站建设小公司
  • 汕头珠宝网站建设网站营销外包公司
  • 商业网站开发岗位需求分析自学网官方网站入口
  • 建网站手机怎么做网站制作怎么报价
  • 音乐制作网站wordpress 查看版本号
  • 广东省建设安全管理协会网站wordpress 页面找不到
  • 个人做啥网站流量大视频模板网站推荐
  • wap 2.0的网站html展示网站源代码