一个LED的N种玩法(七)—FreeRtos
Author: chenzhufly
Email: chenzhufly@126.com
2010-05-08
从前面看大家的讨论,貌似对操作系统都情有独钟。那么这篇就来在操作系统上完成LED程序吧,呵呵!
嵌入式操作系统那么多选哪个呢?当我迷茫,彷徨的时候,我在一篇介绍LPCXpresso的文章中看到这样一段话:Code Red公司功能全面的Red Suite工具包支持运行时执行跟踪和操作系统向导,能够快速实现FreeRTOS配置。
哇,原来LPCXpresso直接就支持FreeRTOS了,真棒~~~~~~~~~先看看再说。
1. 点击File -> New -> Project,选择 C Project
2. 看见没,有个基于LPC1700的FreeRtos模板,可以我们现在的主芯片是LPC1343啊,不匹配!先不管这些,生成个工程再说。填写Project name,以及Project所在位置Location,我这里工程名就叫freertos_testJ
3. 接下来直接点Next,我也没有深入的做研究,有兴趣的话,大家一起多讨论讨论吧
Freertos配置选项
设置Freertos的API
这里选择LPC1343
配置好以后,代码结构如下图所示:
编译,很顺利没有错,J
但是还没有改好,居然还用的是LPC17XX的初始化文件,郁闷!
4. 接着就是按照LPC1343来修改这个工程了,主要有以下几个步骤
1) 首先把cr_startup_lpc17.c 替换成 cr_startup_lpc13.c,这样工程就可以在LPC1343平台上跑起来了。
2) 增加LED测试代码,把include文件放在FreeRTOS_include文件夹,把底层驱动放在FreeRTOS_src文件夹,修改后的代码结构如图所示:
3) 到这里准备工作已经完全就绪,开始搞测试代码。
5. 代码示例
6. 直接修改自动生成的main.c函数,本身已经是两个任务直接的切换,哈哈
7. #include "FreeRTOS.h"
8. #include "Task.h"
9. #include "queue.h"
10.#include "semphr.h"
11.#include "LPC13xx.h" /* LPC13xx definitions */
12.#include "timer16.h"
13.#include "clkconfig.h"
14.#include "gpio.h"
15.
16.#define LED_PORT 0
17.#define LED_BIT 7
18.#define LED_ON 1
19.#define LED_OFF 0
20.
21.int iState = 0;
22.
23.
24.#define USERTASK_STACK_SIZE configMINIMAL_STACK_SIZE
25.
26.void __error__(char *pcFilename, unsigned long ulLine) {
27.}
28.
29.static void setupHardware(void) { //设置clk和led
30. CLKOUT_Setup( CLKOUTCLK_SRC_MAIN_CLK );
31. LPC_IOCON->PIO0_1 &= ~0x07;
32. LPC_IOCON->PIO0_1 |= 0x01; /* CLK OUT */
33.
34. LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
35.
36. GPIOSetDir( LED_PORT, LED_BIT, 1 );
37.}
38.void vUserTask1(void *pvParameters) { //任务1 ,闪灯任务
39.
40.
41. while (1) {
42. if (iState == 0) {
43. GPIOSetValue( LED_PORT, LED_BIT, LED_OFF );
44. } else {
45. GPIOSetValue( LED_PORT, LED_BIT, LED_ON );
46. }
47. //vTaskDelay(100);
48. }
49.}
50.
51.void vUserTask2(void *pvParameters) { //任务2 ,延时任务
52. while (1) {
53. if (iState == 0) {
54. iState = 1;
55. }
56. else {
57. iState = 0;
58. }
59. vTaskDelay(20) ;
60. }
61.}
62.int main(void) {
63. setupHardware();//初始化硬件系统
64.
65. //建立两个任务
66. xTaskCreate( vUserTask1, ( signed portCHAR * ) "Task1", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
67. xTaskCreate( vUserTask2, ( signed portCHAR * ) "Task2", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
68.
69. //任务调度
70. vTaskStartScheduler();
71. return 1;
72.}
到此基于Freertos的led例程建立,演示完毕,有感兴趣的,欢迎参与讨论Freertos相关 J
PDF文档:
一个LED的N种玩法_七_----FreeRtos.pdf
(1006.26 KB, 下载次数: 276)
源代码:
freertos-test.rar
(367.86 KB, 下载次数: 213)
视频短片:
led.rar
(181.99 KB, 下载次数: 208)
更多精彩 稍后继续
[
本帖最后由 chenzhufly 于 2010-5-8 15:23 编辑 ]