建设路21号官方网站网站建设 费用

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

建设路21号官方网站,网站建设 费用,深圳百度推广代理,logo设计网站哪个好一些本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动#xff0c;更多开发板试用活动请关注极术社区网站。作者#xff1a;吴金刚 0.前言 首先感谢极术社区和兆易创新给了这次试用GD32F427开发板的机会。 板子做的虽然简约#xff0c;但是自带了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套了一层壳叫RTOSRTOS2这是一个基于Cortex-M处理器的通用RTOS接口通过这层接口可以快速方便的切换不同的实时操作系统目前除了支持RTX5还支持FreeRTOS。 RTX5的主要特点: 开源免费Apache2.0授权几乎随意商用任务调度方式灵活多样支持时间片抢占式和合作式调度零中断延迟这里的零中断延迟是指ISR的中断相应时间和没有使用 RTX5系统是一样的也就是说用于Cortex-M3/M4/M7的RTX5内核库中没有关闭中断的操作,这点应该算是RTX5一个很大的优势像Ucos-II,Ucos-III和FreeRTOS内核的很多地方关中断操作关中断操作对实时性有哪些危害呢比如此时某个任务正在调用系统API函数而且此时中断正好关闭了也就是进入到了临界区中这个时候如果有一个紧急的中断事件被触发这个中断就不能得到及时执行必须等到中断开启才可以得到执行如果关中断时间超过了紧急中断能够容忍的限度危害是可想而知的。 确定性指在在定义的时间内处理事件和中断RTX5 提供完全确定性的行为这意味着在预定义时间内期限处理事件和中断这个主要得益于RTX5的零中断延迟特性。 1.准备 因为Keil-MDK对RTX5支持的很好, 移植也很方便这里就不详细说明有兴趣的可以参考安富莱电子的《RTX5内核教程》,里面对RTX5的详细系统特性和在Keil-MDK中使用调试方法介绍。我这里主要介绍在IAR环境中的移植和简单使用。除了准备好GD32F427开发板还需做以下准备 IAR开发环境版本要使用7.4以上版本我这里使用的版本是8.40.2IAR_GD32F4xx_ADDON.3.0.0.exe IAR 环境补丁下载地址https://gd32mcu.com/download/…GD32开发板的官方例程GD32F4xx_Demo_Suiteshttps://gd32mcu.com/download/…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; osThreadNum0; 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