专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
STM32
如何在STM32快速创建 FREERTOS和RTX工程呢?
2019-07-14 17:52
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
STM32/STM8
3390
6
1424
如何在
STM32
快速创建 FREERTOS和RTX工程
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
bobnice
1楼-- · 2019-07-15 00:27
使用MDK 打开工程
从上到下 的组依次为 OS 的C文件
.s 启动文件
用户文件
HAL库文件
CMSIS中间件文件
其中 在 第一组中的 cmsis_os.c 中实现了 cmsis_os 到FREERTOS 的中间层转换 稍后会讨论其中一处代码
接下来 添加自己的代码 首先添加 072 上面LED吧 板子不在身边 记得是PA5 控制
先看看 main.c 的 64 到 105行
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 */
}
复制代码
加载中...
bobnice
2楼-- · 2019-07-15 01:10
mian函数 C代码的入口 初始化一些硬件后
osThreadDef(USER_Thread, StartThread, osPriorityNormal, 0, configMINIMAL_STACK_SIZE);
osThreadCreate (osThread(USER_Thread), NULL);
/* Start scheduler */
osKernelStart(NULL, NULL);
定义了一个 线程 USER_Thread 然后启动OS
注意 osThreadDef 是一个宏 定义一个用于描述 线程的结构体 并不是执行函数
宏的第二项参数 StartThread 为线程 入口函数地址。
/* 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 */
}
复制代码
至此mian函数的工作结束了 OS将转向 就绪线程并永不返回 也就是执行StartThread
修改 StartThrea函数 如下
加载中...
bobnice
3楼-- · 2019-07-15 05:22
精彩回答 2 元偷偷看……
加载中...
bobnice
4楼-- · 2019-07-15 06:47
{
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的两个形参
加载中...
bobnice
5楼-- · 2019-07-15 10:23
#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
加载中...
zhuzb0754
6楼-- · 2019-07-15 13:54
cube创建 MDK编辑是最快的
加载中...
一周热门
更多
>
相关问题
STM32F4上I2C(在PROTEUS中模拟)调试不通的问题
6 个回答
芯片供应紧张,准备换个MCU,MM32L系列替换STM32L系列的怎么样?
7 个回答
STM32同时使用两个串口进行数据收发时数据丢包的问题
5 个回答
STM32F103串口通信死机问题
4 个回答
STM32WLE5CC连接SX1268在LoRa模式下能与 SX1278互通吗?
2 个回答
STM32开发板免费用活动
7 个回答
stm32 处理 DHT11占用太多时间,大家程序是怎么设计的
8 个回答
分享一个STM32单片机做的离线编程器代码
9 个回答
相关文章
ST公司第一款无线低功耗单片机模块有效提高物联网设计生产效率
0个评论
如何实现对单片机寄存器的访问
0个评论
通过USB用STM32片内自带Bootloader下载程序及注意事项
0个评论
欲练此功必先自宫之STM32汇编启动,放慢是为了更好的前行
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
STM32
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
从上到下 的组依次为 OS 的C文件
.s 启动文件
用户文件
HAL库文件
CMSIS中间件文件
其中 在 第一组中的 cmsis_os.c 中实现了 cmsis_os 到FREERTOS 的中间层转换 稍后会讨论其中一处代码
接下来 添加自己的代码 首先添加 072 上面LED吧 板子不在身边 记得是PA5 控制
先看看 main.c 的 64 到 105行
- 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_Thread 然后启动OS
注意 osThreadDef 是一个宏 定义一个用于描述 线程的结构体 并不是执行函数
宏的第二项参数 StartThread 为线程 入口函数地址。
- /* 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 */
- }
复制代码至此mian函数的工作结束了 OS将转向 就绪线程并永不返回 也就是执行StartThread
修改 StartThrea函数 如下
- {
- 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
一周热门 更多>