各位看官有的看到这个标题会不屑一顾。其实这个费我一天功夫才搞出来。又有坛友会问:ST的库例程里不是有这个例程么?不错,有是有,不过那个是基于,不带屏的那个
开发板的,且不是用库。下进这款带屏地会不显示,改完代码也不显示。因为芯片还得选择,.S文件得变。。。。。
我这个是自己摸出来地,其实是个RXT的移植方案。费了一天时间主要是MDK5.。0没整明白。行了费话少说啦。。。。。
Keil RTX 是免版税的确定性实时操作系统,适用于 ARM 和 Cortex-M 设备。使用该系统可以创建同时执行多个功能的程序,并有助于创建结构更好且维护更加轻松的应用程序。
产品的几大亮点
- 带有源代码的免版税、确定性的 RTOS
- 灵活的调度:循环、抢先和协作
- 以低的中断延迟执行高速实时操作
- 小的空间占用适用于资源受限的系统
- 不限数量的任务,每个任务都具有 254 个优先级
- 不限数量的邮箱、信号、互斥函数和计时器
- 支持多线程和线程安全运算
- MDK-ARM 中的内核识别调试支持
- 使用 μVision 配置向导的基于对话框的设置
虽然不使用 RTOS 也能创建实时程序(通过在超级循环中执行一个或多个函数),但 Keil RTX 这样的 RTOS 可为您解决许多调度、维护和计时问题。有关 RTOS 和超级循环之间的更详细比较,请查看使用 RTOS 的优势。
优点Keil RTX 实时操作系统提供许多高级功能,其他供应商的 RTOS 产品中并不总是提供这些功能。在选择 RTOS 时,应考虑以下几点:
- RTX 包含在 MDK-ARM 中 - 全功能、商业级 RTX(包括源代码)作为 Keil MDK-ARM 开发工具的一部分提供。这不是评估版。它可完全配置,没有任何限制。因此,如果您计划使用 MDK 进行开发,RTX 是免费的。
- RTX 免版税 - RTX 是免版税提供的。获得了使用许可后,您可以装备使用 RTX 创建的产品,而无需支付其他费用或产生后续成本。
- 市场领先的 RTOS - RTX 一直是嵌入式应用程序中使用的领先 RTOS 之一(2010 年 TechInsights 嵌入式市场调查报告)。您可以信心十足地在应用程序中使用 RTX。
- 灵活的调度 - RTX 提供三种不同的内核调度选项,您可以使用最适合您的应用程序的选项:
- 抢先 - 每个任务都具有不同的优先级,只有在更高优先级的任务准备好运行后才会运行。此选项常用于交互式系统,在用户输入某些内容之前,设备可能处于待机或后台模式。
- 循环 - 每个任务都将运行固定的 CPU 运行时时段(时间段)。数据记录器/系统显示器通常使用循环调度,所有传感器或数据源都会依次进行采样,不分优先级。
- 协作 - 每个任务将一直运行,直到指示其将控制权传递给另一个任务或达到阻止性 OS 调用。可以在要求固定执行顺序的应用程序中查看协作多任务。
- 确定性的行为 - 并非每个 RTOS 都具有确定性。RTX 提供完全确定性的行为,这意味着在预定义时间内(期限)处理事件和中断。您的应用程序可以依赖于一致且已知的进程计时。
- 专为嵌入式系统而设计 - RTX 是专门为基于 ARM 和 Cortex-M MCU 的嵌入式系统而编写的。它并不是根据较大的操作系统或其他架构改写的。它运行速度快,占用的 MCU 资源极少,内存占用量仅为 5KB (ROM)。
- 易于使用 - 学习周期短,产品开发速度快。μVision IDE/调试器完全支持 RTX,其中采用 RTX 任务识别工具以便于在您的应用程序中快速方便地配置和调试 RTX。
- 源代码 - 在所有 MDK-ARM 版本中都包含 RTX 源代码。这对于需要源代码进行产品认证的情况会很有用。
- 支持 - 提供了广泛的资源,包括示例、用户指南以及打印的快速入门指南。Keil 完全支持 RTX。
下面我就说下我的移植步骤哈:
我因为省时间用了,Sys
tick那个例程。有人会问楼主怎么老用例程。我想是简单例程起到模板作用。何乐也不为。
第一步,打Systic_example全目录复制一下。并起名my Systick_example 并保存。
然后用MDK5.0 打开,去掉同Systick相关的所有东东。然后编译下。提示不出错进入下一步骤。
第二步:在MDK快捷方式,
中选中RTX
这时再编译下会有三个错误:
这些都跟中断有关,到
STM32f4xx_it.c那个文件中把冲突的文件都注册掉。
然后再编译一下。没有提示为止。
第三步:
在主文件头加入#include "cmsis_os.h"
把以下文件加到定义后的前面。
- osThreadId tid_ledOn; /* Thread id of thread: ledOn */
- osThreadId tid_ledOff; /* Thread id of thread: ledOff */
- /*----------------------------------------------------------------------------
- Thread 1 'ledOn': switches the LED on
- *---------------------------------------------------------------------------*/
- void ledOn (void const *argument) {
- for (;;) {
- //LED_On(0); /* Turn LED On */
- STM_EVAL_LEDOn(LED3);
- osSignalSet(tid_ledOff, 0x0001); /* set signal to ledoff thread */
- osDelay(2000); /* delay 2s */
- }
- }
- /*----------------------------------------------------------------------------
- Thread 2 'ledOff': switches the LED off
- *---------------------------------------------------------------------------*/
- void ledOff (void const *argument) {
- for (;;) {
- osSignalWait(0x0001, osWaitForever); /* wait for an event flag 0x0001 */
- osDelay(500); /* wait for 500ms */
- //LED_Off(0); /* Turn LED Off */
- STM_EVAL_LEDOff(LED3);
- }
- }
- osThreadDef(ledOn, osPriorityNormal, 1, 0);
- osThreadDef(ledOff, osPriorityNormal, 1, 0);
[color=rgb(51, 102, 153) !important]复制代码
把以下加到主函数里
- /* Initialize LEDs available on STM32F429I-DISCO */
- STM_EVAL_LEDInit(LED3);
- STM_EVAL_LEDInit(LED4);
- /* Turn on LED3 */
- STM_EVAL_LEDOn(LED3);
- tid_ledOn = osThreadCreate(osThread(ledOn) , NULL);
- tid_ledOff = osThreadCreate(osThread(ledOff), NULL);
- osSignalSet(tid_ledOn, 0x0001); /* set signal to ledOn thread */
- osDelay(osWaitForever);
- while(1);
[color=rgb(51, 102, 153) !important]复制代码
以上是一个灯亮,但定义是两个灯。坛友可以自己修改第二个灯。
效果是的PG13再闪,一会占位传一下图片。奥啦!!!!undefined
0