收藏1 举报
int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration----------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* Configure the system clock */ SystemClock_Config(); /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART2_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Init code generated for FreeRTOS */ /* Create Start thread */ osThreadDef(USER_Thread, StartThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate (osThread(USER_Thread), NULL); /* Start scheduler */ osKernelStart(NULL, NULL); /* We should never get here as control is now taken by the scheduler */ /* USER CODE BEGIN 3 */ /* Infinite loop */ while (1) { } /* USER CODE END 3 */ }
osThreadDef(USER_Thread, StartThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
osThreadCreate (osThread(USER_Thread), NULL);
/* Start scheduler */
osKernelStart(NULL, NULL);
/* USER CODE BEGIN 4 */ void Nucleo_072_Led(const void *par); /* USER CODE END 4 */ static void StartThread(void const * argument) { /* USER CODE BEGIN 5 */ osThreadDef(LED_Thread, Nucleo_072_Led, osPriorityNormal, 0, configMINIMAL_STACK_SIZE); osThreadCreate (osThread(LED_Thread), NULL); /* Infinite loop */ for(;;) { osDelay(1); } /* USER CODE END 5 */ }
void Nucleo_072_Led(const void *par) { GPIO_InitTypeDef GPIO_InitStruct; __GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_5; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_LOW; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); for(;;) { GPIOA->ODR^=GPIO_PIN_5;// PA5取反 LED闪烁 osDelay(500); } }到这里可以编译下载到板子上运行 观察现象了 下面创建 RXT 的工程 新建一个工程 勾选 如下选项 红框 不要添加 不知为何 楼主添加 MDK的 startup 编译通不过 F4 的工程没有包含 HAL 接下来 需要自行添加HAL 库 把原来的 main.c 复制一份更名为 rtx_main.c 文件添加完毕 接下来定义 头文件目录和 系统宏 修改 rtx_main.c 下面两处需要修改
{ osThreadDef( StartThread, osPriorityNormal, 0, 0); osThreadCreate (osThread(StartThread), NULL); } osThreadDef( Nucleo_072_Led, osPriorityNormal, 0, 0); osThreadCreate (osThread(Nucleo_072_Led), NULL);不知为何 ST写的 中间件和 MDK的 接口有一点差距 所以 创建线程的地方需要如上修改 修改 stm32f0xx_hal_conf.h 添加 图示内容 不出意外 下面 将可以直接编译了!! 写的有些多了 本来想 继续写 RTOS 基于串口的 应用 太长了 下次发帖写了 下面提出一个讨论 MX 创建的 工程 FREERTOS 中 cmsis_os.c 中 创建一个信号量 osSemaphoreCreate参数 count 直接 传递给 xSemaphoreCreateCounting的两个形参
#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )该宏创建一个 数值型信号量 第一个参数是 信号量最大数值 第二个则为 初始化值 基于串口使用信号量 那么需要如下要求 假设 usart_sem 为串口使用的信号量 每收到一个数据 usart_sem ++ 缓冲 1024字节 需要数据的线程 osSemaphoreWait(usart_sem ); 当有数据时 线程被激活 获取数据 如此我们知道 这个信号量的 最大值应为1024 可是使用 ST 的cmsis_os osSemaphoreCreate 创建一个信号亮 osSemaphoreCreate(0,1024); 会出现这样的问题 ! 此信号量 被赋予初值1024 意味着 这个信号量将可以被osSemaphoreWait 1024次 显然这不是我们想要 通常 我们需要的数值型信号量 最大值可以很大 但是初值 基本为0,或1
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
24
135
2
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号