一,应用使用
**1.**使用CubeIde 时生成hex或者bin,进行下载配置 工程右键》Properties》C/C++ Build 》Settings 》 找到Build Steps选项卡,在“Post-build steps”的“Command”输入以下命令 生成hex:
arm-none-eabi-objcopy "${ProjName}.elf" -O ihex "${ProjName}.hex"
生成bin:
arm-none-eabi-objcopy "${ProjName}.elf" -O binary "${ProjName}.bin"
这样就会在你工程的编译目录下生成对应的和工程同名的hex或bin文件 如果是使用TrueStudio for stm32 需要将“arm-none-eabi-objcopy”替换成“arm-atollic-eabi-objcopy”
图示: 1.选择配置
2.注意生成文件提示
3.选择烧写文件格式。
二、选择Rtos时注意点
**1.**freertos -> soucse -> -> task.c 移植性 queue.c 编译 list.c 平台 port.c
内核包含:
task,queue,list
(timers,croutine定时,协同)
**2.**存储 分heap_1.2.3.4.c ——1,不释放,不删除任务。(内核启动前创建任务的小实时系统); ——2,允许删除,释放任务。(动态小型实时任务); ——3,用于malloc,free ——4,需要在应用代码中直接使用移植层内存分配方案
**1.**使用FreeRTOS时,为防止重复定义,必须从stm32f4xx_it.c/.h中删除SVC_Handler和PendSV_Handler
CMSIS-RTOS是实时操作系统的通用API,此模块由cmsis_os.c/h文件表示
内核信息的控制 API: osKernelInitialize 初始化内核 osKernelstart 启动内核 oskernelRunning 查询内核运行情况 oskernelSysTick,获取内核定时器的计数 osKernelSysTickFrequency, 内核系统定时器的频率 osKernelSystickMicrosec把微妙转为系统内核定时器值 线程管理 API osThreadCreate 开始线程函数 osThreadTerminate, 停止线程函数 osThreadYield 执行传递到下个就绪线程 osThreadGetld 获取线程表示符 osThreadSetPriority 设置线程的执行优先级 osThreadGetPriority 获取当前线程的执行优先级 等待函数 API osDelay 等待指定时间 osWait 等待信号,消息,邮箱等任何事件 定时器管理 API osTimerCreate ,定时器huidiao函数 osTimerStart 重新开始定时器 信号管理 API osSignalSet 设置信号标准 osSignalClear 复位线程信号标志 osSignalClear 挂起执行,直到特定信号被设置 互斥量管理 API osMutexCreat 初始化互斥量 osMutexWait 得到互斥量,等待互斥量可用时 osMutexRelease 释放互斥量 osMutexDelete 删除互斥量 信号量管理APT osSemaphoreCreate 初始化信号量 osSemaphoreWait 等待信号量,等到可用 osSemaphoreRelease 释放信号量 osSemaphoreDelete 删除信号量 内存池管理 API: osPoolCreate 初始化内存池 osPoolAlloc 分配内存快 osPoolCAlloc 分配内存块并置零 osPoolFree 释放内存块 消息队列管理 API: osMessageCreate 初始化消息队列 邮箱管理 API: osMailCreate osMailAlloc osMailCAlloc osMailPut osMailGet osMailFree
3、 RTOS内核本身需要大约5到10 K字节ROM空间 ,创建的线程或队列数增加,RAM使用量就会上升
CPU时钟由FreeRTOSConfig.h中的configCPU_CLOCK_HZ定义
在STM32CubeF4 固件内它由SystemCoreClock提供,
表示HCLK时钟(AHB总线),当通过调用SystemClock_Config()函数配置RCC时钟时会设置此值。
任何使用RTOS API函数的中断服务程序,
其优先级必须手动设置为大于等于FreeRTOSConfig.h文件
中configMAX_SYSCALL_INTERRUPT_PRIORITY的设置值
**1.**怎样使用非SysTick时钟生成时间片中断?用户可选择性地自己提供时间片中断源, 方法是使用非SysTick的定时器生成中断: ?提供vPortSetupTimerInterrupt()的实现, 它会以configTICK_RATE_HZ FreeRTOSConfig.h常量指定的频率生成中断。 ?将xPortSysTickHandler()安装为定时器中断的处理程序, 确保xPortSysTickHandler() 在FreeRTOSConfig.h中未映射至SysTick_Handler(), 且在port.c中未重命名为SysTick_Handler()。
**2.**FreeRTOS在STM32的移植大致由3个文件实现, 一个.h文件定义编译器相关的数据类型和中断处理的宏定义;PORTMACRO.H (portmacro.h) 一个.c文件实现任务的堆栈初始化、系统心跳的管理和任务切换的请求 ;PORT.C (port.c) 一个.s文件实现具体的任务切换; PORTASM.S (portasm.S)
xPortStartScheduler 设置中断优先级?配置心跳时钟
vPortStartFirstTask 定位堆栈地址?触发SVC软中断
vPortSVCHandler 初始化任务环境?调度器开始工作
|