FreeRTOS学习第一篇

2023-05-16

之前在STM32Nano开发板开发是基于裸机开发,即自己在main方法写死循环。死循环轮流执行各个任务逻辑的方法。这样做直接简单,但是不同任务有不同优先级,对CPU响应要求不同。逻辑容易某个任务卡住了,导致别的任务也卡死。比如串口发送长数据时候。LED闪烁会停止。

FreeRTOS移植源码

C#通过Winform串口配合交互的源码

本次移植花了大几天才彻底搞定。官方Demo倒是很快,然而我不想直接用官方Demo删东西搞工程,也不想用他那个目录布局。折腾工程到编译没错误搞了半天。然后把我之前裸机实现的LED、蜂鸣器、串口的功能移植花了小半天。因为创建任务时候把任务优先级和堆栈大小参数给反了。把一个小于32的任务优先级给了堆栈,造成堆栈溢出很多奇特的内存bug。

1.有调用用vTaskDelay延迟函数后就所有任务死掉的消息,然后给前后加临界保护后又正常了。

//进入临界区
taskENTER_CRITICAL(); 
vTaskDelay(10);
//退出临界区
taskEXIT_CRITICAL(); 

2.延迟方法调用崩溃问题通过临界保护解决之后又碰到给串口任务多加一行代码或者少加一行代码导致所有任务卡死问题。然后我就一段段代码去了测试。发现代码留的少就可以,就算加的代码分支执行条件永远是假也会导致任务卡死。那么问题肯定不是业务运行导致异常了。猜测是内存方面问题,然后折腾STM32F10x.s汇编代码的堆栈和FreeRTOSConfig.h的配置搞了好久还是解决不了诡异现象。

3.然后求助专业嵌入式老兄宏伟给看看我代码问题。发现我创建任务把任务优先级和堆栈大小给反了。小于32的堆栈对我串口测试的复杂任务不够。然后结合编译器的编译,有时候能达到微妙的平衡。大概就像下图:
在这里插入图片描述
OS移植第一步搞定了,感受颇深,学习了不少东西,争取把FreeRTOS搞透彻。

不依赖OS写法(不能区分任务紧急程度,难以充分利用CPU算力):

#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "hardware.h"
#include "timer.h"
#include "smg.h"

//zlz的stm32学习
int main(void)
{
	//初始化时钟
	Stm32_Clock_Init(9);
	//初始化延时函数
	delay_init(72);	 
	
	//死循环监听串口消息
	while (1)
	{
		//LED闪烁
		//蜂鸣器响
		//读取串口数据
		//屏幕显示
		//其他
	}
}

所以在功能慢慢做复杂后引入任务调度是必然的。在多个嵌入式实时操作系统里我选择了学习FreeRTOS。为什么选择它呢,一是FreeRTOS是开源的,不涉及收费,真要有用时候免得有版权问题(UCOS商用收费)。二是很多芯片基本标配FreeRTOS了,很流行,资料也不少。综合选择采用FreeRTOS。三是FreeRTOS对硬件要求少,最少3kb就可以跑起来,我这个STM32Nano开发版只能说是20kb内存高配了。

首先到FreeRTOS下载源码,我下载的是最新的FreeRTOS202112.00版本
FreeRTOS官网

解压目录如下:
在这里插入图片描述

目前先学内核,不涉及周边模块。所以-Plus先不管。下图是内核源码和示例目录。
在这里插入图片描述

找到STM32Nano用的芯片的示例
在这里插入图片描述

拷入FreeRTOS源码到自己工程
在这里插入图片描述
配置OS
在这里插入图片描述

工程目录
在这里插入图片描述

主要实现代码
FreeRTOSConfig.h

//配置FreeRTOS的配置模式
#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H


//为1时RTOS使用抢占式调度器,为0时RTOS使用协做式调度器(时间片)
#define configUSE_PREEMPTION		1


//设置为1使用空闲钩子(Idle Hook相似于回调函数),0忽略空闲钩子。
//当RTOS调度器开始工做后,为了保证至少有一个任务在运行,空闲任务被自动建立,占用最低优先级(0优先级)。对于已经删除的RTOS任务,空闲任务能够释放分配给它们的堆栈内存。所以,在应用中应该注意,使用vTaskDelete()函数时要确保空闲任务得到必定的处理器时间。除此以外,空闲任务没有其它特殊功能,所以能够任意的剥夺空闲任务的处理器时间。
//应用程序也可能和空闲任务共享同个优先级。
//空闲任务钩子是一个函数,这个函数由用户来实现,RTOS规定了函数的名字和参数,这个函数在每一个空闲任务周期都会被调用。
//void vApplicationIdleHook(void );
#define configUSE_IDLE_HOOK			0

//设置为1使用时间片钩子(Tick Hook),0忽略时间片钩子。
//时间片中断能够周期性的调用一个被称为钩子函数(回调函数)的应用程序。时间片钩子函数能够很方便的实现一个定时器功能。
//只有在FreeRTOSConfig.h中的configUSE_TICK_HOOK设置成1时才可使用时间片钩子。一旦此值设置成1,就要定义钩子函数,函数名和参数以下所示
//void vApplicationTickHook( void );
#define configUSE_TICK_HOOK			0

//写入实际的CPU内核时钟频率,也就是CPU指令执行频率,一般称为Fcclk。配置此值是为了正确的配置系统节拍中断周期。
#define configCPU_CLOCK_HZ			( ( unsigned long ) 72000000 )	
	
//RTOS 系统节拍中断的频率。即一秒中断的次数,每次中断RTOS都会进行任务调度。
//系统节拍中断用来测量时间,所以,越高的测量频率意味着可测到越高的分辨率时间。
//可是,高的系统节拍中断频率也意味着RTOS内核占用更多的CPU时间,所以会下降效率。
//RTOS演示例程都是使用系统节拍中断频率为1000HZ,这是为了测试RTOS内核,比实际使用的要高。(实际使用时不用这么高的系统节拍中断频率)
#define configTICK_RATE_HZ			( ( TickType_t ) 100 )

//配置应用程序有效的优先级数目。任何数量的任务均可以共享一个优先级,使用协程能够单独的给与它们优先权。
//在RTOS内核中,每一个有效优先级都会消耗必定量的RAM,所以这个值不要超过你的应用实际须要的优先级数目。
#define configMAX_PRIORITIES		( 32 )


//定义空闲任务使用的堆栈大小。一般此值不该小于对应处理器演示例程文件FreeRTOSConfig.h中定义的数值。
#define configMINIMAL_STACK_SIZE	( ( unsigned short ) 128 )
	
// RTOS内核总计可用的有效的RAM大小。仅在你使用官方下载包中附带的内存分配策略时,才有可能用到此值。
//每当建立任务、队列、互斥量、软件定时器或信号量时,RTOS内核会为此分配RAM,这里的RAM都属于configTOTAL_HEAP_SIZE指定的内存区。
//后续的内存配置会详细讲到官方给出的内存分配策略。
#define configTOTAL_HEAP_SIZE		(( size_t) (17*1024))

//调用任务函数时,须要设置描述任务信息的字符串,这个宏用来定义该字符串的最大长度。
//这里定义的长度包括字符串结束符’\0’
#define configMAX_TASK_NAME_LEN		(16)

//设置成1表示启动可视化跟踪调试,会激活一些附加的结构体成员和函数。
#define configUSE_TRACE_FACILITY	0

//定义configUSE_16_BIT_TICKS为1意味着portTickType表明16位无符号整形,
//定义configUSE_16_BIT_TICKS为0意味着portTickType表明32位无符号整形。
#define configUSE_16_BIT_TICKS		0


//为1时空闲任务放弃CPU使用权
//这个参数控制任务在空闲优先级中的行为。仅在知足下列条件后,才会起做用。
//使用抢占式内核调度
//用户任务使用空闲优先级。
#define configIDLE_SHOULD_YIELD		1


//设置成1表示使用协程,0表示不使用协程。若是使用协程,必须在工程中包含croutine.c文件。
//在当前嵌入式硬件环境下,不建议使用协程,FreeRTOS的开发者早已经中止开发协程。
#define configUSE_CO_ROUTINES 		0
// 应用程序协程(Co-routines)的有效优先级数目,任何数目的协程均可以共享一个优先级。使用协程能够单独的分配给任务优先级。
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

//加入下面这些API
#define INCLUDE_vTaskPrioritySet		1
#define INCLUDE_uxTaskPriorityGet		1
#define INCLUDE_vTaskDelete				1
#define INCLUDE_vTaskCleanUpResources	0
#define INCLUDE_vTaskSuspend			1
#define INCLUDE_vTaskDelayUntil			1
#define INCLUDE_vTaskDelay				1

//配置内核使用的中断优先级,这里是8 bit,默认最低优先级
#define configKERNEL_INTERRUPT_PRIORITY 		255
//配置系统所能调用管理的最高优先级191为BF,最高优先级是11,优先级0-10不归系统管理
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 	191 /* equivalent to 0xb0, or priority 11. */


//配置系统内核优先级,这里使用的是4bit优先级,所以最低为15,跟1中的配置相同
#define configLIBRARY_KERNEL_INTERRUPT_PRIORITY	15

#endif


InitOS.h

//定义宏,防止头文件重复引用
#ifndef __INITOS
#define __INITOS
//标准IO
#include <stdio.h>
//OS调度引入
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
//芯片头文件引入
#include "stm32f10x_it.h"

//初始化硬件
void InitHardware(void);

#endif


InitOS.c

#include "InitOS.h"
#include "stm32f10x_nvic.h"

//初始化硬件
void InitHardware(void)
{
	//从处于预期状态的时钟开始
	RCC_DeInit();
	//启动HSE高速时钟
	RCC_HSEConfig( RCC_HSE_ON );
	//等待时钟就绪
	while( RCC_GetFlagStatus( RCC_FLAG_HSERDY ) == RESET )
	{
	}
	//闪存需要 2 个等待状态
	*( ( unsigned long * ) 0x40022000 ) = 0x02;
	//HCLK=SYSCLK
	RCC_HCLKConfig( RCC_SYSCLK_Div1 );
	//PCLK2=HCLK
	RCC_PCLK2Config( RCC_HCLK_Div1 );
	//PCLK1=HCLK/2
	RCC_PCLK1Config( RCC_HCLK_Div2 );
	//PLLCLK=8MHz*9=72MHz
	RCC_PLLConfig( RCC_PLLSource_HSE_Div1, RCC_PLLMul_9 );
	//使能PLL
	RCC_PLLCmd( ENABLE );
	//等待PLL时钟准备就绪
	while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
	{
	}
	//设置PLL时钟为系统时钟源
	RCC_SYSCLKConfig( RCC_SYSCLKSource_PLLCLK );
	//等待时钟使用系统时钟源成功
	while( RCC_GetSYSCLKSource() != 0x08 )
	{
	}
	//使能GPIOA,GPIOB,GPIOC,GPIOD,GPIOE,AFIO时钟
	RCC_APB2PeriphClockCmd(	RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
							| RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO, ENABLE );
	//使能SPI2外设时钟
	RCC_APB1PeriphClockCmd( RCC_APB1Periph_SPI2, ENABLE );
	//设置向量表的基础地址
	NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0 );
  //设置权限组
	NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 );
	//设置SysTick的时钟源
	SysTick_CLKSourceConfig( SysTick_CLKSource_HCLK );
	//配置串口中断优先级
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = configLIBRARY_KERNEL_INTERRUPT_PRIORITY;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init( &NVIC_InitStructure );

}





STM32F10x.s(调整了串口中断等)

;/*****************************************************************************/
;/* STM32F10x.s: Startup file for ST STM32F10x device series                  */
;/*****************************************************************************/
;/* <<< Use Configuration Wizard in Context Menu >>>                          */
;/*****************************************************************************/
;/* This file is part of the uVision/ARM development tools.                   */
;/* Copyright (c) 2005-2007 Keil Software. All rights reserved.               */
;/* This software may only be used under the terms of a valid, current,       */
;/* end user licence from KEIL for a compatible version of KEIL software      */
;/* development tools. Nothing else gives you the right to use this software. */
;/*****************************************************************************/


;// <h> Stack Configuration
;//   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Stack_Size      EQU     0x0000200

                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp


;// <h> Heap Configuration
;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;// </h>

Heap_Size       EQU     0x00000000

                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit

				IMPORT xPortPendSVHandler
				IMPORT xPortSysTickHandler
				IMPORT vPortSVCHandler
				IMPORT vTimer2IntHandler

                PRESERVE8
                THUMB


; Vector Table Mapped to Address 0 at Reset

                AREA    RESET, DATA, READONLY
                EXPORT  __Vectors

__Vectors       DCD     __initial_sp              ; Top of Stack
                DCD     Reset_Handler             ; Reset Handler
                DCD     NMI_Handler               ; NMI Handler
                DCD     HardFault_Handler         ; Hard Fault Handler
                DCD     MemManage_Handler         ; MPU Fault Handler
                DCD     BusFault_Handler          ; Bus Fault Handler
                DCD     UsageFault_Handler        ; Usage Fault Handler
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     0                         ; Reserved
                DCD     vPortSVCHandler           ; SVCall Handler
                DCD     DebugMon_Handler          ; Debug Monitor Handler
                DCD     0                         ; Reserved
                DCD     xPortPendSVHandler        ; PendSV Handler
                DCD     xPortSysTickHandler       ; SysTick Handler

                ; External Interrupts
                DCD     WWDG_IRQHandler           ; Window Watchdog
                DCD     PVD_IRQHandler            ; PVD through EXTI Line detect
                DCD     TAMPER_IRQHandler         ; Tamper
                DCD     RTC_IRQHandler            ; RTC
                DCD     FLASH_IRQHandler          ; Flash
                DCD     RCC_IRQHandler            ; RCC
                DCD     EXTI0_IRQHandler          ; EXTI Line 0
                DCD     EXTI1_IRQHandler          ; EXTI Line 1
                DCD     EXTI2_IRQHandler          ; EXTI Line 2
                DCD     EXTI3_IRQHandler          ; EXTI Line 3
                DCD     EXTI4_IRQHandler          ; EXTI Line 4
                DCD     DMAChannel1_IRQHandler    ; DMA Channel 1
                DCD     DMAChannel2_IRQHandler    ; DMA Channel 2
                DCD     DMAChannel3_IRQHandler    ; DMA Channel 3
                DCD     DMAChannel4_IRQHandler    ; DMA Channel 4
                DCD     DMAChannel5_IRQHandler    ; DMA Channel 5
                DCD     DMAChannel6_IRQHandler    ; DMA Channel 6
                DCD     DMAChannel7_IRQHandler    ; DMA Channel 7
                DCD     ADC_IRQHandler            ; ADC
                DCD     USB_HP_CAN_TX_IRQHandler  ; USB High Priority or CAN TX
                DCD     USB_LP_CAN_RX0_IRQHandler ; USB Low  Priority or CAN RX0
                DCD     CAN_RX1_IRQHandler        ; CAN RX1
                DCD     CAN_SCE_IRQHandler        ; CAN SCE
                DCD     EXTI9_5_IRQHandler        ; EXTI Line 9..5
                DCD     TIM1_BRK_IRQHandler       ; TIM1 Break
                DCD     TIM1_UP_IRQHandler        ; TIM1 Update
                DCD     TIM1_TRG_COM_IRQHandler   ; TIM1 Trigger and Commutation
                DCD     TIM1_CC_IRQHandler        ; TIM1 Capture Compare
                DCD     vTimer2IntHandler         ; TIM2
                DCD     TIM3_IRQHandler           ; TIM3
                DCD     TIM4_IRQHandler           ; TIM4
                DCD     I2C1_EV_IRQHandler        ; I2C1 Event
                DCD     I2C1_ER_IRQHandler        ; I2C1 Error
                DCD     I2C2_EV_IRQHandler        ; I2C2 Event
                DCD     I2C2_ER_IRQHandler        ; I2C2 Error
                DCD     SPI1_IRQHandler           ; SPI1
                DCD     SPI2_IRQHandler           ; SPI2
                DCD     USART1_IRQHandler     ; USART1
                DCD     USART2_IRQHandler         ; USART2
                DCD     USART3_IRQHandler         ; USART3
                DCD     EXTI15_10_IRQHandler      ; EXTI Line 15..10
                DCD     RTCAlarm_IRQHandler       ; RTC Alarm through EXTI Line
                DCD     USBWakeUp_IRQHandler      ; USB Wakeup from suspend


                AREA    |.text|, CODE, READONLY


; Reset Handler

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  __main
                LDR     R0, =__main
                BX      R0
                ENDP


; Dummy Exception Handlers (infinite loops which can be modified)                

NMI_Handler     PROC
                EXPORT  NMI_Handler               [WEAK]
                B       .
                ENDP
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler         [WEAK]
                B       .
                ENDP
MemManage_Handler\
                PROC
                EXPORT  MemManage_Handler         [WEAK]
                B       .
                ENDP
BusFault_Handler\
                PROC
                EXPORT  BusFault_Handler          [WEAK]
                B       .
                ENDP
UsageFault_Handler\
                PROC
                EXPORT  UsageFault_Handler        [WEAK]
                B       .
                ENDP
SVC_Handler     PROC
                EXPORT  SVC_Handler               [WEAK]
                B       .
                ENDP
DebugMon_Handler\
                PROC
                EXPORT  DebugMon_Handler          [WEAK]
                B       .
                ENDP
PendSV_Handler  PROC
                EXPORT  PendSV_Handler            [WEAK]
                B       .
                ENDP
SysTick_Handler PROC
                EXPORT  SysTick_Handler           [WEAK]
                B       .
                ENDP

Default_Handler PROC

                EXPORT  WWDG_IRQHandler           [WEAK]
                EXPORT  PVD_IRQHandler            [WEAK]
                EXPORT  TAMPER_IRQHandler         [WEAK]
                EXPORT  RTC_IRQHandler            [WEAK]
                EXPORT  FLASH_IRQHandler          [WEAK]
                EXPORT  RCC_IRQHandler            [WEAK]
                EXPORT  EXTI0_IRQHandler          [WEAK]
                EXPORT  EXTI1_IRQHandler          [WEAK]
                EXPORT  EXTI2_IRQHandler          [WEAK]
                EXPORT  EXTI3_IRQHandler          [WEAK]
                EXPORT  EXTI4_IRQHandler          [WEAK]
                EXPORT  DMAChannel1_IRQHandler    [WEAK]
                EXPORT  DMAChannel2_IRQHandler    [WEAK]
                EXPORT  DMAChannel3_IRQHandler    [WEAK]
                EXPORT  DMAChannel4_IRQHandler    [WEAK]
                EXPORT  DMAChannel5_IRQHandler    [WEAK]
                EXPORT  DMAChannel6_IRQHandler    [WEAK]
                EXPORT  DMAChannel7_IRQHandler    [WEAK]
                EXPORT  ADC_IRQHandler            [WEAK]
                EXPORT  USB_HP_CAN_TX_IRQHandler  [WEAK]
                EXPORT  USB_LP_CAN_RX0_IRQHandler [WEAK]
                EXPORT  CAN_RX1_IRQHandler        [WEAK]
                EXPORT  CAN_SCE_IRQHandler        [WEAK]
                EXPORT  EXTI9_5_IRQHandler        [WEAK]
                EXPORT  TIM1_BRK_IRQHandler       [WEAK]
                EXPORT  TIM1_UP_IRQHandler        [WEAK]
                EXPORT  TIM1_TRG_COM_IRQHandler   [WEAK]
                EXPORT  TIM1_CC_IRQHandler        [WEAK]
                EXPORT  TIM2_IRQHandler           [WEAK]
                EXPORT  TIM3_IRQHandler           [WEAK]
                EXPORT  TIM4_IRQHandler           [WEAK]
                EXPORT  I2C1_EV_IRQHandler        [WEAK]
                EXPORT  I2C1_ER_IRQHandler        [WEAK]
                EXPORT  I2C2_EV_IRQHandler        [WEAK]
                EXPORT  I2C2_ER_IRQHandler        [WEAK]
                EXPORT  SPI1_IRQHandler           [WEAK]
                EXPORT  SPI2_IRQHandler           [WEAK]
                EXPORT  USART1_IRQHandler         [WEAK]
                EXPORT  USART2_IRQHandler         [WEAK]
                EXPORT  USART3_IRQHandler         [WEAK]
                EXPORT  EXTI15_10_IRQHandler      [WEAK]
                EXPORT  RTCAlarm_IRQHandler       [WEAK]
                EXPORT  USBWakeUp_IRQHandler      [WEAK]

WWDG_IRQHandler
PVD_IRQHandler
TAMPER_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMAChannel1_IRQHandler
DMAChannel2_IRQHandler
DMAChannel3_IRQHandler
DMAChannel4_IRQHandler
DMAChannel5_IRQHandler
DMAChannel6_IRQHandler
DMAChannel7_IRQHandler
ADC_IRQHandler
USB_HP_CAN_TX_IRQHandler
USB_LP_CAN_RX0_IRQHandler
CAN_RX1_IRQHandler
CAN_SCE_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTCAlarm_IRQHandler
USBWakeUp_IRQHandler

                B       .

                ENDP


                ALIGN


; User Initial Stack & Heap

                IF      :DEF:__MICROLIB
                
                EXPORT  __initial_sp
                EXPORT  __heap_base
                EXPORT  __heap_limit
                
                ELSE
                
                IMPORT  __use_two_region_memory
                EXPORT  __user_initial_stackheap
__user_initial_stackheap

                LDR     R0, =  Heap_Mem
                LDR     R1, =(Stack_Mem + Stack_Size)
                LDR     R2, = (Heap_Mem +  Heap_Size)
                LDR     R3, = Stack_Mem
                BX      LR

                ALIGN

                ENDIF


                END

main.c

#include "InitOS.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "hardware.h"

//任务优先级定义和栈大小定义
//主检查任务优先级为空闲任务优先级加3
//LED任务优先级和栈大小
#define LedTaskPriority			(tskIDLE_PRIORITY+3)
//任务的栈大小
#define LedTaskStakSize			(configMINIMAL_STACK_SIZE + 50)


//蜂鸣器任务优先级和栈大小
#define BeepTaskPriority			(tskIDLE_PRIORITY+4)
//任务的栈大小
#define BeepTaskStakSize			(configMINIMAL_STACK_SIZE + 50)

//串口控制任务优先级和栈大小
#define UsartTaskPriority			(tskIDLE_PRIORITY+10)
//任务的栈大小
#define UsartTaskStakSize			(configMINIMAL_STACK_SIZE + 1500)

//定时器2中断
void vTimer2IntHandler( void )
{
	TIM2->SR &= (u16)~((u16)0x0001);
}


//主函数
int main( void )
{
	//初始化硬件信息
	InitHardware();
	//初始化LED灯硬件环境
    InitLedEnv();
	//初始化蜂鸣器环境
	InitBeepEnv();
	//初始化按键
	InitKeyEnv();
	//初始化串口
	InitUsart(72, 9600);
	
	//要注意堆栈大小
	//LED0任务
    xTaskCreate(LED0Task,"LED0",LedTaskStakSize,NULL,LedTaskPriority,NULL);
	//LED1任务
	//xTaskCreate(LED1Task,"LED1",LedTaskStakSize,NULL,LedTaskPriority,NULL);
	//LED2任务
	//xTaskCreate(LED2Task,"LED2",LedTaskStakSize,NULL,LedTaskPriority,NULL);
	//LED3任务
	//xTaskCreate(LED3Task,"LED3",LedTaskStakSize,NULL,LedTaskPriority,NULL);
	
	//蜂鸣器任务
	xTaskCreate(BeepTask,"BEEP",BeepTaskStakSize,NULL,BeepTaskPriority,NULL);
	
	//串口控制任务
	xTaskCreate(UsartCmdChlTask,"USART",UsartTaskStakSize,NULL,UsartTaskPriority,NULL);
	//开始任务调度
	vTaskStartScheduler();
	return 0;
}



hardware.c

#include "InitOS.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "usart.h"
#include "hardware.h"
#include "string.h"

//串口控制任务
//系统节拍中断的频率设置了100,一个节拍10毫秒
void UsartCmdChlTask(void *pvParameters)
{
	//命令开始
	const u8 ENQ = 0x05;
	//命令结束
	const u8 EOT = 0x04;
	//命令约定从Asscii码15开始
	const u8 Key0OpenCmd = 0x0F;
	const u8 Key0CloseCmd = 0x10;
	const u8 Key1OpenCmd = 0x11;
	const u8 Key1CloseCmd = 0x12;
	const u8 Key2OpenCmd = 0x13;
	const u8 Key2CloseCmd = 0x14;
	const u8 Key3OpenCmd = 0x15;
	const u8 Key3CloseCmd = 0x16;
	const u8 Key4OpenCmd = 0x17;
	const u8 Key4CloseCmd = 0x18;
	const u8 Key5OpenCmd = 0x19;
	const u8 Key5CloseCmd = 0x1A;
	const u8 Key6OpenCmd = 0x1B;
	const u8 Key6CloseCmd = 0x1C;
	const u8 Key7OpenCmd = 0x1D;
	const u8 Key7CloseCmd = 0x1E;
	const u8 BeepOpenCmd = 0x1F;
	const u8 BeepCloseCmd = 0x20;
	//检验仪器数据
	const char* machData="02 30 36 30 33 32 0D FF 20 52 45 53 55 4C 54 20 20 0D 21 20 30 31 31 2E 39 53 68 20 20 20 0D 22 20 30 32 2E 37 31 53 20 20 20 20 0D 23 20 30 32 32 2E 38 53 20 20 20 20 0D 24 20 30 30 2E 34 35 53 20 20 20 20 0D 25 20 30 30 33 2E 38 53 20 20 20 20 0D 28 20 30 38 2E 34 35 53 48 20 20 20 0D 29 20 30 37 31 2E 30 53 20 20 20 20 0D 2A 20 30 30 2E 31 33 53 20 20 20 20 0D 2B 20 30 30 31 2E 31 53 20 20 20 20 0D 2C 20 30 30 2E 31 35 53 20 20 20 20 0D 2D 20 30 30 31 2E 33 53 20 20 20 20 0D 2E 20 30 30 2E 30 34 53 20 20 20 20 0D 2F 20 30 30 30 2E 33 53 20 20 20 20 0D 30 20 30 30 2E 30 34 53 20 20 20 20 0D 31 20 30 30 30 2E 33 53 20 20 20 20 0D 32 20 30 34 2E 35 36 20 20 20 20 20 0D 33 20 30 31 33 2E 31 20 20 20 20 20 0D 34 20 30 33 39 2E 38 20 20 20 20 20 0D 35 20 30 30 30 38 37 20 20 20 20 20 0D 36 20 30 32 38 2E 37 20 20 20 20 20 0D 37 20 30 33 33 2E 30 20 20 20 20 20 0D 38 20 30 31 36 2E 31 20 68 20 20 20 0D 3A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 40 20 30 30 32 36 33 20 20 20 20 20 0D 41 20 30 30 37 2E 39 20 20 20 20 20 0D 42 20 30 2E 32 30 39 20 20 20 20 20 0D 43 20 30 31 32 2E 35 20 20 20 20 20 0D 50 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 51 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 52 20 20 20 20 20 0D 53 20 20 20 20 20 20 20 0D 54 20 4E 45 55 2B 0D 55 20 0D 56 20 0D 57 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 3D 66 AE F0 FF E5 B7 89 75 6B 64 60 5E 60 5E 5E 5F 5D 51 43 3B 35 33 31 2F 2D 2C 2A 29 28 27 26 26 25 25 25 24 24 24 23 23 23 23 23 22 21 21 21 21 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 58 20 20 20 20 20 20 20 20 20 20 20 20 21 20 20 20 20 20 20 20 20 20 21 24 29 30 3D 4B 5F 7C 98 B2 CD DF F2 FB FD FF F8 E9 DA CA B5 9D 8B 80 73 67 5B 51 4C 47 41 3B 38 34 2F 2D 2D 2A 27 26 24 23 22 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 59 20 20 20 20 20 20 20 20 20 20 20 26 34 48 63 7E A0 C2 E3 F8 FF FF FF F8 F1 EA E3 D6 CF C8 BB B4 A7 A0 92 8C 85 7E 77 77 71 6A 63 63 5C 56 56 4F 4F 48 3B 3B 34 34 2D 2D 26 26 26 26 26 26 26 26 26 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 5A 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 3D 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 40 3F 38 35 32 31 30 2E 2C 2A 2B 29 27 27 26 26 26 25 27 23 25 24 23 24 24 23 22 23 21 22 22 22 21 22 21 21 22 21 21 20 20 21 20 21 20 20 21 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 21 0D 5B 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 30 31 31 34 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 42 32 38 38 38 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 35 34 46 43 31 30 30 30 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 41 44 35 35 38 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 31 35 31 46 31 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 33 42 46 33 46 33 30 30 30 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 44 46 36 38 34 30 38 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 38 42 43 45 39 30 30 34 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 31 45 42 46 46 45 41 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 43 37 46 46 46 46 34 30 32 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 38 37 46 46 46 39 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 36 37 46 46 46 46 44 32 30 30 30 30 30 30 30 30 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 44 46 46 46 44 41 34 30 38 30 30 34 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 32 33 46 46 46 46 46 44 32 30 30 30 30 30 30 30 32 30 38 30 30 30 30 30 30 30 30 30 32 30 30 30 31 42 46 46 46 46 46 44 34 34 32 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 46 46 46 46 46 42 45 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 46 46 46 44 41 30 30 30 30 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 35 41 46 46 46 46 45 46 31 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 30 30 30 30 30 30 44 46 46 46 46 46 34 45 38 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 31 46 46 46 46 46 45 33 30 30 30 38 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 46 46 39 31 34 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 42 46 46 46 46 46 38 30 30 30 32 30 30 30 32 31 38 30 30 30 30 30 30 30 30 30 30 30 30 30 32 37 46 46 46 46 46 46 41 36 38 30 30 30 34 30 30 31 30 30 30 30 30 30 30 30 30 31 30 30 30 30 31 42 36 46 46 46 46 44 41 43 43 30 32 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 37 46 46 46 46 46 45 30 30 32 30 38 30 30 30 38 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 37 46 46 46 46 46 44 36 30 30 30 32 30 30 30 30 34 30 30 30 30 30 30 30 30 30 31 30 30 30 30 33 37 46 46 46 46 46 46 38 34 30 30 30 30 30 38 30 30 43 34 30 31 30 30 30 30 30 30 38 30 30 30 31 33 46 46 46 46 46 42 43 30 30 30 30 34 30 30 38 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 32 46 46 46 46 46 46 46 41 34 30 30 30 34 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 39 46 46 46 46 46 46 45 30 37 46 30 32 30 30 30 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 46 46 46 46 46 44 43 34 39 36 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 46 43 39 30 30 30 30 32 41 41 30 30 30 30 30 30 32 30 30 30 30 30 30 30 30 30 30 33 46 46 46 46 46 43 43 41 30 34 34 43 36 31 30 32 31 30 30 34 30 30 30 30 30 30 30 30 30 30 32 31 46 46 46 46 46 35 39 39 31 32 34 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 46 46 46 46 43 37 34 30 39 31 41 35 34 30 30 30 34 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 46 44 46 42 46 46 39 36 32 31 36 31 33 31 32 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 32 46 45 46 45 46 45 36 43 44 42 35 32 32 34 41 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 45 36 46 44 45 45 39 36 32 42 46 32 38 34 31 30 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 32 41 33 37 46 33 45 34 45 35 46 31 37 45 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 32 32 34 42 41 35 32 46 45 35 44 43 34 41 41 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 32 37 32 30 42 37 44 31 37 39 31 45 45 38 45 36 30 38 30 30 30 30 30 30 31 30 30 30 30 30 30 31 30 30 39 44 45 37 41 43 46 37 39 34 43 36 33 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 36 32 37 45 36 45 37 36 45 35 39 37 35 33 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 32 46 37 37 45 46 45 38 46 43 39 34 36 30 31 30 31 34 30 30 30 30 30 30 30 30 30 30 30 32 33 37 46 46 46 46 46 36 45 42 45 33 35 31 31 38 30 30 32 30 30 30 30 30 31 30 30 30 30 30 32 31 31 46 46 46 46 46 46 44 44 46 34 43 34 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 33 46 46 46 46 46 46 44 45 41 34 30 30 34 30 30 30 30 30 38 30 31 30 30 30 30 30 30 30 30 30 33 46 37 46 46 46 46 46 41 35 44 30 30 30 34 30 30 32 30 30 30 30 30 30 30 30 30 30 30 30 30 30 34 46 46 46 46 46 46 46 45 38 36 34 31 30 32 31 30 32 30 30 38 30 30 30 30 30 30 30 30 30 30 30 39 42 46 46 46 46 46 46 36 38 44 30 32 38 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 35 46 46 46 46 46 46 32 36 39 30 30 30 30 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 42 46 46 46 44 44 42 30 45 30 30 31 30 32 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 31 34 44 46 37 46 46 46 33 30 38 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 37 46 42 46 46 31 43 30 34 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 35 30 33 46 39 37 31 32 33 31 30 34 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 34 31 31 41 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 38 31 38 36 36 42 32 30 41 30 30 30 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 33 30 30 38 30 42 43 34 30 33 39 42 34 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 41 32 38 30 34 32 31 35 38 34 31 30 30 30 34 30 30 31 30 30 30 30 38 30 30 30 30 30 30 30 30 30 30 30 31 30 30 38 30 30 30 30 31 30 38 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0D 5D 20 30 31 32 20 30 36 37 20 31 32 30 20 30 30 30 20 30 30 30 0D 5E 20 30 32 34 20 30 34 39 0D 5F 20 30 39 38 0D 60 20 30 31 32 20 30 36 37 20 31 32 30 0D 61 20 30 32 34 20 30 32 37 20 30 35 30 20 30 33 35 20 31 31 38 20 30 33 31 20 30 37 32 20 30 37 33 20 31 30 30 20 30 37 32 20 31 30 30 20 31 31 38 20 30 32 37 20 30 36 37 20 30 35 31 20 30 30 32 20 30 30 32 20 30 30 32 0D 66 20 20 20 20 20 4C 6D 6E 65 2D 20 20 20 20 20 0D 70 20 30 31 0D 71 20 31 39 2F 31 31 2F 31 34 20 31 30 68 33 39 6D 6E 34 39 73 0D 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 73 20 30 30 30 30 0D 75 20 31 30 32 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 76 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 77 20 20 20 20 20 20 20 20 20 0D 78 20 20 20 20 0D 79 20 30 0D 7B 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 7C 20 20 20 20 20 20 20 20 20 20 20 0D 7D 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 7F 20 41 42 58 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 80 20 42 0D 83 20 41 42 58 0D 8B 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0D 90 20 30 31 33 38 32 20 30 31 33 30 37 20 30 31 33 39 36 20 30 31 33 37 37 20 30 31 34 32 31 20 30 31 34 36 33 20 30 31 33 31 38 20 30 31 33 39 33 20 30 31 33 37 37 20 30 31 33 39 39 20 30 31 34 34 34 20 30 31 33 34 35 20 30 38 33 34 37 20 30 38 32 37 37 0D 91 20 30 33 35 34 37 20 30 33 35 33 38 20 30 33 36 36 36 20 30 33 36 30 33 20 30 33 36 34 34 20 30 33 35 39 33 20 30 33 36 34 35 20 30 33 37 32 30 20 30 33 36 31 31 20 30 33 35 36 32 20 30 33 35 32 32 20 30 33 35 37 39 20 32 31 35 39 32 20 32 31 36 34 30 0D 92 20 30 32 30 31 35 20 30 32 30 31 35 20 30 32 30 31 35 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 30 30 30 30 20 30 32 30 31 35 20 30 33 36 33 36 0D 93 20 30 32 37 37 39 31 32 20 30 32 37 37 34 37 35 20 30 32 38 35 34 31 35 20 30 32 37 37 34 33 36 20 30 32 38 30 39 36 34 20 30 32 37 36 39 34 31 20 30 32 38 30 34 34 32 20 30 32 38 34 34 35 30 20 30 32 37 39 31 31 36 20 30 32 37 33 33 35 33 20 30 32 36 39 38 36 32 20 30 32 37 35 32 31 39 20 31 36 37 36 31 34 34 20 31 36 36 32 34 34 33 0D 94 20 30 32 36 31 31 20 30 32 36 36 37 20 30 32 37 31 38 20 30 32 36 34 30 20 30 32 36 36 37 20 30 32 35 39 31 20 30 32 36 32 33 20 30 32 36 36 34 20 30 32 36 30 34 20 30 32 35 39 31 20 30 32 36 32 31 20 30 32 36 34 34 20 31 35 38 39 35 20 31 35 37 34 38 0D 95 20 30 31 33 38 32 20 30 31 33 30 37 20 30 31 33 39 36 20 30 31 33 37 37 20 30 31 34 32 31 20 30 31 34 36 33 20 30 31 33 31 38 20 30 31 33 39 33 20 30 31 33 37 37 20 30 31 33 39 39 20 30 31 34 34 34 20 30 31 33 34 35 20 30 38 33 34 37 20 30 38 32 37 37 0D 96 20 30 36 30 33 38 20 30 30 30 39 33 0D A3 20 56 0D A4 20 31 0D A5 20 31 0D A6 20 31 0D A7 20 31 0D FD 20 38 38 62 38 0D 03\r\n";

	//死循环监听串口消息
	while (1)
	{
		//数据已经读取完到缓冲区了
		if (USART_RX_BUF_HASDATA == 1)
		{
			//得到此次接收到的数据长度
			u8 len = USART_RX_BUF_CUTINDEX;
			//printf("\r\nzlz-stm32:您发送的消息为:\r\n\r\n");
			//是否开始命令
			int cmdStart = 0;
			//开始命令的为
			int cmdStartIndex = 0;
			//当前命令
			u8 cmd;
			//循环发生数据
			for (u8 t = 0; t < len; t++)
			{
				//ENQ开始命令
				if (USART_RX_BUF[t] == ENQ)
				{
					cmdStart = 1;
					cmdStartIndex = t;
					continue;
				}
				//第2位命令
				if (cmdStart == 1)
				{
					cmd = USART_RX_BUF[t];
					cmdStart = 0;
				}
				//EOT开始命令
				if (USART_RX_BUF[t] == EOT && (t - cmdStartIndex) == 2)
				{
					//执行命令
					//开启LED0
					if (cmd == Key0OpenCmd)
					{
						LED0Open();
					}
					//关闭LED0
					else if (cmd == Key0CloseCmd)
					{
						LED0Close();
					}
					//开启LED1
					else if (cmd == Key1OpenCmd)
					{
						LED1Open();
					}
					//关闭LED1
					else if (cmd == Key1CloseCmd)
					{
						LED1Close();
					}
					//开启LED2
					else if (cmd == Key2OpenCmd)
					{
						LED2Open();
					}
					//关闭LED2
					else if (cmd == Key2CloseCmd)
					{
						LED2Close();
					}
					//开启LED3
					else if (cmd == Key3OpenCmd)
					{
						LED3Open();
					}
					//关闭LED3
					else if (cmd == Key3CloseCmd)
					{
						LED3Close();
					}
					//开启LED4
					else if (cmd == Key4OpenCmd)
					{
						LED4Open();
					}
					//关闭LED4
					else if (cmd == Key4CloseCmd)
					{
						LED4Close();
					}
					//开启LED5
					else if (cmd == Key5OpenCmd)
					{
						LED5Open();
					}
					//关闭LED5
					else if (cmd == Key5CloseCmd)
					{
						LED5Close();
					}
					//开启LED6
					else if (cmd == Key6OpenCmd)
					{
						LED6Open();
					}
					//关闭LED6
					else if (cmd == Key6CloseCmd)
					{
						LED6Close();
					}
					//开启LED7
					else if (cmd == Key7OpenCmd)
					{
						LED7Open();
					}
					//关闭LED7
					else if (cmd == Key7CloseCmd)
					{
						LED7Close();
					}
					//开启蜂鸣器
					else if (cmd == BeepOpenCmd)
					{
						BeepOpen();
					}
					//关闭蜂鸣器
					else if (cmd == BeepCloseCmd)
					{
						BeepClose();
					}
					printf("收到命令:");
					USART1->DR = cmd;
					//等待发送结束
					while ((USART1->SR & 0X40) == 0);
					printf("\r\n");
				}
			}
			//设置为读取完成状态
			USART_RX_BUF_HASDATA = 0;
		}
		//得到按键值
		int key = GetPressKey(0);
		//按了KEY
		if (key >= 0)
		{
			if (key == 0)
			{
				printf("KEY0\r\n");
			}
			else if (key == 1)
			{
				printf("KEY1\r\n");
			}
			else if (key == 2)
			{
				printf("KEY2\r\n");
			}
			else if (key == 3)
			{
				GPIOC->ODR |= 1 << 0;
				//响一声
				BeepOpen();
				//延迟
				vTaskDelay(10);
				BeepClose();
				//用用u8格式发送字符串
				U8Send(machData);
				vTaskDelay(10);
				//发送仪器数据
				//printf(machData);
				printf("zlz\r\n");
			}
		}
		//延迟
		vTaskDelay(10);
	}
}



//是否已经初始化LED
int LED_IS_INIT = 0;

//是否已经初始化蜂鸣器
int BEEP_IS_INIT = 0;

//打开LED0
void LED0Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 0);
}

//关闭LED0
void LED0Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 0;
}

//打开LED1
void LED1Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 1);
}

//关闭LED1
void LED1Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 1;
}

//打开LED2
void LED2Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 2);
}

//关闭LED2
void LED2Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 2;
}

//打开LED3
void LED3Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 3);
}

//关闭LED3
void LED3Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 3;
}

//打开LED4
void LED4Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 4);
}

//关闭LED4
void LED4Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 4;
}

//打开LED5
void LED5Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 5);
}

//关闭LED5
void LED5Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 5;
}

//打开LED6
void LED6Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 6);
}

//关闭LED6
void LED6Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 6;
}

//打开LED7
void LED7Open(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数后取非再做且运算就是把当前位数的电平设置低位。比如i=2即LED2,00000100取非之后为11111011再和ODR的值与运算
	//第3位电平设置低,其他不变
	GPIOC->ODR &= ~(1 << 7);
}

//关闭LED7
void LED7Close(void)
{
	//检查并初始化
	if (LED_IS_INIT == 0)
	{
		//初始化LED灯
		InitLedEnv();
		LED_IS_INIT = 1;
	}
	//1左移当前索引位数再做或运算就是把当前位数的电平设置高位。比如i=2即LED2,ODR寄存器值和00000100或运算
	//第3位电平设置高,其他不变
	GPIOC->ODR |= 1 << 7;
}

//打开fengmingq
void BeepOpen(void)
{
	//检查并初始化
	if (BEEP_IS_INIT == 0)
	{
		//初始化蜂鸣器
		InitBeepEnv();
		BEEP_IS_INIT = 1;
	}
	//通过操作ODR寄存器设置9位置为0即低电平,响
	GPIOB->ODR &= ~(1 << 8);
}

//关闭蜂鸣器
void BeepClose(void)
{
	//检查并初始化
	if (BEEP_IS_INIT == 0)
	{
		//初始化蜂鸣器
		InitBeepEnv();
		BEEP_IS_INIT = 1;
	}
	//通过操作ODR寄存器设置9位置为1即高电平,不响
	GPIOB->ODR |= 1 << 8;
}


//把字符串按u8发送
//str:字符串
void U8Send(const char * str)
{
	int len=strlen(str);
	for(int i=0;i<len;i+=3)
	{
		if(i+1<len)
		{
			char one=str[i];
			char tow=str[i+1];
			u8 oneHex=HexToInt(one)*16+HexToInt(tow);
			USART1->DR = oneHex;
			//等待发送结束
			while ((USART1->SR & 0X40) == 0);
		}
	}
}

//把十六进制字符串转换数组
//c:字符串
int HexToInt(char c)
{
	if(c=='0')
	{
		return 0;
	}
	else if(c=='1')
	{
		return 1;
	}
	else if(c=='2')
	{
		return 2;
	}
	else if(c=='3')
	{
		return 3;
	}
	else if(c=='4')
	{
		return 4;
	}
	else if(c=='5')
	{
		return 5;
	}
	else if(c=='6')
	{
		return 6;
	}
	else if(c=='7')
	{
		return 7;
	}
	else if(c=='8')
	{
		return 8;
	}
	else if(c=='9')
	{
		return 9;
	}
	else if(c=='A')
	{
		return 10;
	}
	else if(c=='B')
	{
		return 11;
	}
	else if(c=='C')
	{
		return 12;
	}
	else if(c=='D')
	{
		return 13;
	}
	else if(c=='E')
	{
		return 14;
	}
	else if(c=='F')
	{
		return 15;
	}
	return 16;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习第一篇 的相关文章

  • k8s 1.18.20版本部署

    身为k8s初学者 xff0c 在掌握k8s理论知识的同时 xff0c 也需要掌握一下实际部署k8s的过程 xff0c 对于理论的学习起到一定的帮助作用 罗列了一下相关步骤 xff0c 请各位参考 xff1a 一 环境准备 三台虚机 xff1
  • java后端对接外部系统(HttpClient HttpPost)

    前言 最近遇到一个需求对接外部系统 xff0c 我们自己的系统发送请求 xff0c 根据请求内容的不同调用不同的外部系统 举例 xff1a 我们是做互联网医院的 xff0c 根据医生开处方选择药店的不同 xff0c 调用各药店自己的系统 x
  • “轻松搞定CMake”系列之find_package用法详解

    本文是 轻松搞定CMake 系列博客中的一篇 xff0c 该篇文章的主要目的是详细讲解一下CMake中搜包命令find package的使用和原理 其他更多文章请参考 xff1a 轻松搞定CMake 系列博客概述 文章目录 1 find p
  • 一遍成功的ROS主从机详细配置

    ROS支持多机互通 xff0c 可以设置一台主机 xff0c 多台从机 xff0c 主机中运行roscore xff0c 启动master节点 xff0c 从机直接运行其他节点 xff0c 在配置好的机器之间就可以互相通信了 xff0c 就
  • pip install列出待安装包的所有版本

    问题描述 一般我们在使用pip Install命令安装Python软件包的时候 xff0c 会想知道能安装的包版本的是多少 xff0c 这样方便自己选择可能的兼容版本进行安装 xff0c 在pip某个版本之前获取待安装包的所有版本命令比较简
  • ImportError with scipy.misc cannot import toimage错误解决

    问题描述 在使用如下代码时出现错误 xff1a span class token keyword import span scipy span class token punctuation span misc scipy span cla
  • AttributeError: module ‘requests‘ has no attribute ‘get‘

    问题描述 执行python程序时报错 xff1a AttributeError module span class token string 39 requests 39 span has no attribute span class t
  • Ubuntu下dpkg -i 安装deb报错 trying to overwrite shared

    问题表述 Ubuntu 22 04下 xff0c 执行下述命令时报错 xff1a 命令 xff1a span class token function sudo span dpkg i libglapi mesa 22 0 5 0ubunt
  • 4k高分屏Windows10下软件字体过小解决办法

    在Windows10下使用Matlab xff0c 由于是4k显示屏 xff0c 本来以为Matlab会出现字体过小的情况 xff0c 结果并没有出现什么问题 字体显示一切正常 xff0c 然而在打开Simulink时 xff0c Matl
  • Eigen矩阵运算开源库使用完全指南

    Eigen库是一个开源的矩阵运算库 xff0c 其利用C 43 43 模板编程的思想 xff0c 构造所有矩阵通过传递模板参数形式完成 由于模板类不支持库链接方式编译 xff0c 而且模板类要求全部写在头文件中 xff0c 从而导致导致Ei
  • “轻松搞定CMake”系列之CMakeLists文件编写语法规则详解

    文章目录 基本语法规则常见CMakeLists txt中指令剖析从VS项目配置过程理解CMakeLists内容CMake中常用变量汇总常用CMakeLists文件模板基础模板使用OpenCV库CMakeLists文件模板使用PCL库CMak
  • Centos7 XFS(dm-0):Internal error XFS_WANT_CORRUPTED_GOTO

    在k8s的道路上我们都是小白 xff0c 每天启动虚机都会遇到各种各样的问题 xff0c 这不 部署的k8s虚机启动发现操作系统启动异常 xff0c 提示如下报错信息 XFS xff08 dm 0 xff09 Internal error
  • 招聘笔试行测题之图形推理题解题思路汇总

    在一些公司的招聘过程中 xff0c 多少都会在笔试过程中遇到行测题 xff0c 这些行测题如果没有事先做过一些针对性的训练 xff0c 还是会感觉挺费劲的 xff0c 本博客主要汇总行测题中的图形推理题的一些解题思路 xff0c 供大家参考
  • ROS之tf空间坐标变换完全详解

    本博文主要汇总了自己在使用ROS中tf坐标变换包时查找的一些参考资料和博客 xff0c 包括了tf和部分tf2的使用 xff0c 在此感谢本博文中出现的所有的博客链接 xff01 参考资源 xff1a ROS官网详细介绍 xff1a htt
  • Word2016写论文之尾注功能——参考文献自动编号与引用(包括方括号去除方法)

    本系列文章主要详细介绍本人在使用Word2016写论文过程所用到的各种操作 xff0c 这些操作都非常的实用 xff0c 能够大为减少论文排版的工作量 其中很多方法也都是参考网上一些优秀博客的 xff0c 经过本人的实践成功之后才记录在此
  • vnc 设置不同用户登录

    a 在root用户下切换到其他用户 xff0c 以wolf用户为例 xff1a su wolf b 设置vnc连接密码 xff1a vncpasswd c 启动vnc服务 xff1a vncserver
  • 推荐几款常用的性能测试工具

    对内容不感兴趣拉到最后领取今天的外卖红包 常用的性能测试工具 对于开发人员来说 xff0c 首选是一些开源免费的性能 xff08 压力 xff09 测试软件 xff0c 例如 ab xff08 ApacheBench xff09 JMete
  • kubeadmin 快速部署k8s集群

    安装要求 在开始之前 xff0c 部署Kubernetes集群机器需要满足以下几个条件 xff1a 一台或多台机器 xff0c 操作系统 CentOS7 x 86 x64硬件配置 xff1a 2GB或更多RAM xff0c 2个CPU或更多
  • GetCurrentDirectory、SetCurrentDirectory和GetModuleFileName

    一 学习 GetModuleFileName xff1a 方法一 xff1a 想要访问执行程序 exe 路径下的文件 xff0c 有以下几个步骤 xff1a 1 先通过函数GetModuleFileName获取执行程序的绝对路径 TCHAR
  • C++定义全局类对象

    可能我这个全局类的说法不是很准确 xff0c 不过其实就是变量的扩展延伸 比如你想把一个类让全部的CPP都能用 xff0c 而不是一个变量 xff0c 那么需要这样定义 xff1a 假设有一个预编译头stdafx h 在stdafx h中加

随机推荐

  • Linux服务器VG扩容、LV扩容

    测试环境中K8s集群部署过程中发现磁盘大小太小 xff0c 需要对现有虚机的磁盘进行扩容 xff0c 计划 步骤1 虚机增加一块磁盘 步骤2 将磁盘添加到原有vg组中 步骤3 通过vg中资源给原有磁盘挂载目录进行lv扩容 实施步骤 xff1
  • Openstack云平台脚本部署之Neutron网络服务配置(九)

    目录 一 简介 二 部署脚本 2 1 网络节点独立部署 2 2 控制节点与网络节点融合部署 2 3 脚本详细介绍 三 参考文档 四 源码 五 系列文章 一 简介 Openstack网络服务Neutron主要负责网络连接任务 xff0c 包括
  • Android开发java调用C简单示例

    目录 下载NDK和CMake新建NDK项目写入C 43 43 代码 xff0c 并运行 本文使用的Android Studio版本是windows版Android Studio Bumblebee 2021 1 1 Patch 2 先看下最
  • 互联网单点登录集成方案

    为了迎合公司互联网化经营 xff0c 业务部门均纷纷上马了互联网的项目 xff0c 部门应用之间各自为政 xff0c 无法形成公司整体品牌效应 xff0c 以及影响用户体验 xff0c 故 xff0c 有了以下的单点登录集成方案 概述 整合
  • 【软件教程】如何让vscode连接ssh时记住密码

    准备软件 客户机安装vscode xff08 vscode官网https code visualstudio com xff09 客户机和服务器配置ssh xff0c 确保能够连接 VSCode ssh记住密码教程 一 在Client客户机
  • 车辆检测--DAVE: A Unified Framework for Fast Vehicle Detection and Annotation

    DAVE A Unified Framework for Fast Vehicle Detection and Annotation ECCV2016 本文使用深度学习进行车辆检测和属性学习 提出的系统为 Detection and Ann
  • 对抗学习用于目标检测--A-Fast-RCNN: Hard Positive Generation via Adversary for Object Detection

    A Fast RCNN Hard Positive Generation via Adversary for Object Detection CVPR 2017 Caffe code https github com xiaolonw a
  • 人脸识别--SphereFace: Deep Hypersphere Embedding for Face Recognition

    SphereFace Deep Hypersphere Embedding for Face Recognition CVPR2017 https github com wy1iu sphereface pytorch https gith
  • 运动相机检测无人机-- Detecting Flying Objects using a Single Moving Camera

    Detecting Flying Objects using a Single Moving Camera PAMI 2017 http cvlab epfl ch research unmanned detection https dri
  • [转载]Python SMTP发送邮件-smtplib模块

    在进入正题之前 xff0c 我们需要对一些基本内容有所了解 xff1a 常用的电子邮件协议有SMTP POP3 IMAP4 xff0c 它们都隶属于TCP IP协议簇 xff0c 默认状态下 xff0c 分别通过TCP端口25 110和14
  • c语言和c++有什么区别

    差不多是win98跟winXP的关系 C 43 43 是在C的基础上增加了新的理论 xff0c 玩出了新的花样 所以叫C加加 C是一个结构化语言 xff0c 它的重点在于算法和数据结构 C程序的设计首要考虑的是如何通过一个过程 xff0c
  • 梳理LVM逻辑卷管理,

    在Linux操作系统会时不时碰到卷有关的操作 xff0c 以下也是罗列了相关操作内容 xff0c 仅供参考 创建PV VG LV的方法 将各物理磁盘或分区的系统类型设为Linux LVM xff0c 其system ID为8e xff0c
  • 使用sqlyog连接 Mysql 出现1251错误

    使用sqlyog连接 Mysql 出现1251错误 简述 xff1a 1251 client does not support authentication protocol requested by server consider upg
  • 准备给ubuntu18.04安装杀毒软件

    如题 xff0c 电脑最近总出现些奇奇怪怪的小问题 xff0c 还是得装个杀毒软件 xff0c 看是不是中病毒了 输入sudo apt get install clamtk 安装完成后 xff0c 输入clamtk 即可 xff0e 卸载方
  • 使用Nginx代理地址

    DotNetCore在Linux发布时候 xff0c 由于不止一个产品组发布网站 xff0c 不像以前大家都用IIS的80发布网站 那么就存在大家抢80端口的情况 xff0c 为了让大家不比加上端口为此用Nginx代理URL实现网站地址代理
  • CentOS安装Cache数据库

    适用CentOS7 6 CentOS8上安装Intersystem公司的Cache数据库 xff0c 资料基本是空白 xff0c 分享一下 首先安装解压软件unzip和libicu xff0c 最小化安装的缺 xff0c 全安装的不缺 yu
  • Cache数据库之ECP搭建

    Cache作为非关系数据库 xff0c 其强大毋庸置疑 首先其Globle结构 xff0c 直接暴露的表Globel数据 xff0c 以及提供的M语言操作Globle达到的最优查询速度 ECP xff08 企业缓存协议 xff09 更是提供
  • Sebia电泳绘图

    Sebia这仪器真是个奇葩的存在 自己仪器有图不存文件 xff0c LIS要的话还得自己按数据绘制 还有蛋白电泳 固定电泳 画不画参考线等不同要求 xff08 奇葩的很 xff09 按理这种事不属于lis范围 xff0c 无奈国内lis太卷
  • nginx代理与负载均衡

    随着谷歌浏览器不断的改变https调用websocket和非https资源的策略 xff0c 从谷歌大概70以后不允许https调用非https资源和ws的websocket 后面实现了wss解决谷歌这一策略的影响 随着谷歌到90后版本限制
  • FreeRTOS学习第一篇

    之前在STM32Nano开发板开发是基于裸机开发 xff0c 即自己在main方法写死循环 死循环轮流执行各个任务逻辑的方法 这样做直接简单 xff0c 但是不同任务有不同优先级 xff0c 对CPU响应要求不同 逻辑容易某个任务卡住了 x