如何创建新的freertos创建线程工程

关注您的每一次发问!
FAQ技术支持
问:希望NXP下次做一个这样的网络研讨会:选用NXP的某个DEMO结合FREERTOS一步步地在该环境下做一次完整的工程创建,设置,编译,排错,运行调试的过程,这样应该是有吸引力的。(FreeRTOS在恩智浦 MCU平台上的移植和应用)
详情可以结合自己使用的芯片类型,访问/content/project/freertos-nxp-m0-m3-and-m4-mcus
答案内容中有失实成分(须说明失实部分并阐述理由)
其他(请说明理由)
无相关数据
无相关数据
相关开发工具
无相关数据
相关解决方案
无相关数据
无相关数据
无相关数据你的位置:
&& 详细内容
Adam Taylor玩转MicroZed连载45:FreeRTOS—创建我们自己的任务
热度178票&&浏览2309次
时间:日 17:34
作者:Adam Taylor
在上一篇博客中成功地演示了FreeRTOS并在基于Zynq的MicroZed板上运行之后,显然我们想要能够编写我们自己的应用程序。因此,我们将首先举一个简单的例子。我们将配置的XADC并且在串行链路上输出结果。应用程序检查接收到的值,如果这个值超过预设值,代码就会点亮LED作为警报。在之后的博客中,这个例子会指引我们观察我们如何在任务间交流信息,发送更复杂的应用。
代码开发的第一步就是创建一个函数,在我们启动RTOS 调度程序前用来初始化XADC。这将允许我们在这个例子里运行的两个任务之一中使用XADC。这个函数会是一个标准函数,正如我们在这个系列中之前创建了许多次一样。
这个例子使用了两个任务。第一个任务是读取XADC温度,将获得的值添加到队列里。第二个任务是从队列里读取值并执行温度检验。在这个应用程序里,
第二个任务也会在串行链路上输出数据,这样我们就可以看到发生的情况。这两个任务展示了我们怎样在Zynq
SoC中在硬件外设之间通信,使用一个任务从硬件获得值,然后在第二个任务里使用这些获得的值。任务间通信是嵌入式系统中使用RTOS的重要方面。
带来的两个例子中非常有帮助的FreeRTOS演示代码:完整演示和更简单的闪烁演示。闪烁LED演示是通过在main.c里设置预处理器声明来控制的:
#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY
设置这个标志位并重建应用程序得到一个简单的例子——MicroZed板载LED闪烁。通过在两个任务之间以预定义的速率并使用队列来传递数据。这个代码正好能够达到我们需要的目的,所以这个简单的演示带给我们想要开发的应用代码的有用启示。
正如上面提到的,我们首先要创建的事情是一个配置例程,用于初始化Zynq SoC的XADC,使其可用。记住要添加需要的包含文件和访问Zynq SoC的XADC必要的声明。我们在这篇博客里做了很多次,所以这对你来说已经很习惯了。
下一步就是修改传输任务,读取XADC温度,将得到的值放在队列里,供接收进程读取。实现这个的代码如下:
static void prvQueueSendTask( void *pvParameters )
TickType_t xNextWakeT
unsigned long ulValueToSend = 100UL;
( void ) pvP
xNextWakeTime = xTaskGetTickCount();
printf("task tx");
vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );
ulValueToSend = XAdcPs_GetAdcData(&XADCInst, XADCPS_CH_TEMP);
xQueueSend( xQueue, &ulValueToSend, 0U );
接收进程从队列中取出这个值。然后我们将接收到的值与期望值做比较,当接收到的值大于期望值时切换LED。
static void prvQueueReceiveTask( void *pvParameters )
unsigned long ulReceivedV
unsigned long ulExpectedValue = 43000;
( void ) pvP
printf("task rx");
xQueueReceive( xQueue, &ulReceivedValue, portMAX_DELAY );
printf("Raw Value = %lu", ulReceivedValue);
if( ulReceivedValue == ulExpectedValue )
vParTestToggleLED( mainTASK_LED );
ulReceivedValue = 0U;
从上面的代码可以看出,这个简单的应用就是当温度超过警戒值时,LED点亮。但是,在很多情况下会导致LED不断闪烁,因为边界温度值会快速地在高于和低于阈值之间摆动。我们通过引入滞后现象来解决这个问题,这样LED只会在温度充分下降且停止波动时才会熄灭。
原文链接:
© Copyright 2014 Xilinx Inc.
如需转载,请注明出处
对本篇资讯内容的质量打分:
当前平均分:-0.31 (91次打分)
【已经有87人表态】
[感动最多的]
[路过最多的]
[高兴最多的]
[难过最多的]
[搞笑最多的]
[愤怒最多的]
[无聊最多的]
[同情最多的]后使用快捷导航没有帐号?
查看: 2112|回复: 5
注册时间最后登录阅读权限100积分8460精华4帖子
TA的每日心情奋斗1&小时前签到天数: 1435 天[LV.10]以坛为家III
AVR上的RTOS可能是种类最多的,有avrx、ucOS、FreeRTOS、ChibiRTOS、Atomthreads等等,还有很多国内高手写的小rtos,加起来起码有几十种吧。虽然现在很多已经停止开发,甚至网站也没有了,但是仍然是非常经典的。
下面先尝试移植FreeRTOS到ATmega328P Xplained Mini上。
首先需要安装。目前FreeRTOS的最新稳定版本是8.1.2,8.2版本暂时还是beta状态,所以就选择了8.1.2版。FreeRTOS的下载是放在SourceForge上,但是一些原因现在SF经常下载不了。如果需要下载,可以通过SF的镜像,例如。
安装FreeRTOS后,就可以开始我们的移植了。为了速度更快一些,先以AS4为例,AS6下基本是一样的。先创建一个新项目,并在项目文件夹下创建FreeRTOS目录。这样项目就可以和FreeRTOS结合起来,方便使用相对目录管理。(这里因为可能会有多个例子,所有的例子会共用FreeRTOS的文件,所以例子程序中FreeRTOS的目录和项目文件的目录就平级了)
然后在将FreeRTOS的文件复制过来。FreeRTOS的源码很大,因为包括了很多架构的移植,以及100多兆的例程,为了节约空间,我在例子中删除了绝大部分的东西,只保留了AVR相关的部分。
13:05 上传
下一步就是添加FreeRTOS的文件到项目中,具体的文件参考一下图片和例程。
13:05 上传
然后在项目文件夹中新建一个文件,保存为FreeRTOSConfig.h,这就是项目文件对FreeRTOS的配置。可以从FreeRTOS的例程中复制一个过来,修改一下使用。主要就是定义configCPU_CLOCK_HZ(时钟频率)、configTICK_RATE_HZ(节拍频率)、configMAX_PRIORITIES(最大优先级)等。例程中时钟设置为8M,因为我将ATmega328P Xplained Mini改为了3.3V,所以开发板的时钟频率自动降低到8M。如果是5V供电,时钟还是16M。
13:05 上传
在就是设置一下文件的搜索路径,需要将FreeRTOS文件的路径添加进来。此外还需要将当前目录也加进来,因为这是FreeRTOSConfig.h所在的目录。
13:34 上传
在main.c中写一小段代码,进行简单的测试。/*
&&单个任务的使用。
&&
&&* 使用 xTaskCreate 创建任务
&&* vTaskStartScheduler 启动调度器
&&* 在任务中使用 vTaskDelay 进行延时
&&
*/
#include &FreeRTOS.h&
#include &task.h&
#include &cfg.h&
#include &macromcu.h&
void vTaskCode( void * pvParameters )
{
&&const portTickType xDelay = 100 / portTICK_RATE_MS;
&&for( ;; )
&&{
& & vTaskDelay( xDelay );
& & PININV(LED1);
&&}
}
int main()
{
&&PINDIR(LED1, PIN_OUTPUT);
&&xTaskCreate( vTaskCode, &TASK1&, configMINIMAL_STACK_SIZE, NULL, 1, NULL );
&&vTaskStartScheduler();
&&while(1);
&&return 0;
}复制代码先编译测试一下,发现编译有错误。检查后发现是port.c文件的问题,TIMSK没有定义。这是因为FreeRTOS是以atmega323为例的,和atmega328有一些区别。先将TIMSK修改为TIMSK1,在检查一下port.c中,还有没有问题。果然又发现TIMER1中断的名称需要修改。新版本的AVRGCC使用了新的命名方式,于是也修改为TIMER1_COMPA_vect。这次编译可以通过了。
先在Proteus中仿真一下,发现RTOS没有跑起来。再次检查port.c,发现定时器中断允许位设置有问题,FreeRTOS中设置的是#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE ( ( uint8_t ) 0x10 )复制代码但是在atmega328P中,OCIE1A在TIMSK1的bit1上。于是再进行修改:#define portCOMPARE_MATCH_A_INTERRUPT_ENABLE& & & & (1&&OCIE1A)//( ( uint8_t ) 0x10 )复制代码在编译仿真,LED开始闪了,说明RTOS开始运行了。如图:
13:19 上传
移植FreeRTOS时,虽然中间有一点波折,但是还算比较快,使用也很方便。
完整的AS4参考例程
(319.82 KB, 下载次数: 168)
12:40 上传
点击文件名下载附件
注册时间最后登录阅读权限60积分3340精华0帖子
状元, 积分 3340, 距离下一级还需 6660 积分
TA的每日心情奋斗2&小时前签到天数: 851 天[LV.10]以坛为家III
谢谢楼主分享!!!!!!!!!
注册时间最后登录阅读权限50积分2087精华0帖子
进士, 积分 2087, 距离下一级还需 913 积分
TA的每日心情开心 20:32签到天数: 346 天[LV.8]以坛为家I
呵呵,正好想学freerots,mark一下
注册时间最后登录阅读权限50积分2997精华0帖子
进士, 积分 2997, 距离下一级还需 3 积分
TA的每日心情奋斗12&小时前签到天数: 699 天[LV.9]以坛为家II
写的好,学习和参考了,谢了
注册时间最后登录阅读权限30积分357精华0帖子
秀才, 积分 357, 距离下一级还需 143 积分
TA的每日心情开心 14:42签到天数: 9 天[LV.3]偶尔看看II
谢谢楼主分享!!!!!!!!!
注册时间最后登录阅读权限10积分15精华0帖子
白丁, 积分 15, 距离下一级还需 35 积分
该用户从未签到
ATmega328P 跑系统有点累吧
爱板会员勋章
注册成为爱板网会员
发帖机器勋章
在论坛积极发帖,数量巨大,质量较高
在线达人勋章
在线时间长,且活跃度高
活跃会员勋章
经常参与各类话题的讨论,发帖内容较有主见
论坛骨干勋章
在论坛积极发帖,并积极与坛友交流互动,成为论坛骨干力量
在线之王勋章
在线时间非常长,且活跃度高
站长推荐 /3
可评估8种高性能传感器的套件Sensor Shiled,可让工程师方便的进行传感器的评估、开发。3月2日之前,参加ROHM Sensor Shield 传感器评估套件有奖问卷,即可获得ROHM Sensor Kit、米家小米无压电饭锅等多种好礼。
活动期间,在爱板商城的Maxim 专区或美信商城官网购买任意产品即可参加以下活动领取现金红包!同时美信商城已推出单笔订单满100美金,大陆地区运费全免的优惠活动。立即参与
罗姆传感器评估套件 SensorShield-EVK-001支持Arduino Uno、mbed等开放平台。可将罗姆的8种高性能传感器组合以进行评估。最适于传感器评估、初期组件评估、培训教材。3月2日之前可点击免费申请,立即查看!
Powered by Discuz!当前位置: >>>
在S3C2440上移植 FreeRTOS
FreeRTOS的一个开源实时操作系统,类似于uCOS/VxWorks.但是有几个特点是,uCOS是开源但是商用要收费。而FreeRTOS不但开源,商用也完全不受限制。另外一个是整个操作系统的核心只有四个C源代码和一些头文件,实在是出出乎人的意料
Andrew Huang
一.关于FreeRTOS
FreeRTOS的一个开源实时操作系统,类似于uCOS/VxWorks.但是有几个特点是,uCOS是开源但是商用要收费。而FreeRTOS不但开源,商用也完全不受限制。另外一个是整个操作系统的核心只有四个C源代码和一些头文件,实在是出出乎人的意料.因此可以在更为简单的硬件环境下运行FreeRTOS,象ARM7之类没有MMU的CPU,还包括大部分OS不能运行的单片机环境。因此很多人开始用这个OS.
&&& 另有人提到,freertos 支持任务优先调度,并且同一优先级任务支持时间片轮番调度, ucos不支持时间片轮番调度。&freertos
任务数不受限制,最小RAM&400 byte ,rom & 4 kbyte,&&优点:简单,轻小,简明,免费,升级快。
接触这个OS的原因是在一家大公司的做C实时编程,对方提到自己原来一直是在单片机用FreeRTOS,因此想结合一下这个OS讲一下。了解FreeRTOS发现也相当简单,但是我手头都是S3C2440的板,但官方在ARM9下只有AT91的版本。而且是针对RVDS的。因此动了念头在用ADS移植FreeRTOS到S3C2440的念头。
二.FreeRTOS框架
&FreeRTOS的官方网站是 ,我使用是目前最新一个版本 6.0.5
国内也有网站将其文档翻译成中文
用source insight 简单的查看各个源码和代码,以及demo的代码,基本上可以分析出如下结果。
2.1 内核代码
&&& FreeRTOS的内核代码是croutine.c list.c queue.c
tasks.c,头文件在include下.其中list.c,queue.c是实际上两种数据结构链表和队列的操作代码。这样内核代码实际上tasks.c和croutine.c.
其中tasks.c是用实时操作系统常见的Task的概念,或者是一般大型OS中的线程概念。每个Task的堆栈是独立的。而croutine.c描述是一种更为节约的任务模型,共享堆栈的任务模式。这样跟task.c是并行的代码。这样一个OS内核实际上只有一个C源代码实现的!!,tasks.c也不大,只有2300多行。croutine.c更小了,只有
2.2 OS操作硬件代码
&&& 操作系统操作具体的CPU的硬件代码在portable目录,是按编译器类型来划分的,如GCC,RVDS(即ADS的升级版)
在某一个编译器下,又有具体CPU的控制代码。比如像这个&E:\FreeRTOS\Source\portable\GCC\ARM7_AT91SAM7S。每个CPU操作代码必须要实现
portmacro.h 和port.c 两个代码。这就是大部分的OS所说的BSP代码了。
2.3 完整target源码
有底层开发经验的工程师都知道,一个程序想在CPU上运行起来。还有一个最重要代码,就是汇编写的引导代码,以及操作系统的调用代码。FreeRTOS是把这一部分代码放在Demo目录,你可以看不同开发板的代码。引导代码就写在这里,象LPC2106代码就写在Demo/ARM7_LPC2106_GCC,在这个目录下我们能清楚看到boot.s.
从这一些源码来分析,FreeRTOS对这一些代码没有什么规定,前提只求在这个一些代码要有一个名为
main()的函数把操作系统调起来。一般调用象上例中的调用OS的代码是main.c中的main().从代码可以看到,都在创建一些Task(),最后进行OS的调度循环。
main( void )
&&&&/* Setup the
hardware for use with the Olimex demo board.
&&&&prvSetupHardware();
&&&&/* Start
the demo/test application tasks. */
&&&&vStartIntegerMathTasks( tskIDLE_PRIORITY );
&&&&vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
&&&&vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
&&&&vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
&&&&vStartMathTasks( tskIDLE_PRIORITY );
&&&&vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
&&&&vStartDynamicPriorityTasks();
&&&&vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
&&&&/* Start
the check task - which is defined in this file.
&&&&xTaskCreate(
vErrorChecks, ( signed char * ) &Check&, configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
&&&&/* Now all the tasks have been started - start the
scheduler.
&&&&NOTE : Tasks run in system mode and the scheduler runs in
Supervisor mode.
&&&&The processor MUST be in supervisor mode when
vTaskStartScheduler is
&&&&called. The demo applications included in the
FreeRTOS.org download switch
&&&&to supervisor mode prior to main being
called. If you are not using one of
&&&&these demo application projects then
ensure Supervisor mode is used here. */
&&&&vTaskStartScheduler();
Should never reach here! */
&&&&return 0;
从它的Makefile中,我们可以看到,完整的代码还要链接2.1 /2.2 的相关代码。
这里是ARM9用IAR编译器的目录结构
从上述分析的我们得出两个结论。
&& 一个在确定target运行的完整代码需要三大块源码 2.1 /2.2/2.3
&&&在一个新的target移植FreeRTOS需要增加两块代码,一是在Portable目录下增加相应的OS操作硬件代码。第一个是在demo目录下增加相应引导代码。
2.4 第三方项目源码
&& 在demo/common 目录下,放着FreeRTOS已经成功移植第3方项目,象uIP/lwIP/FatFs
等,在你的项目里可以考虑引入这一些源码。在很多项目还移植httpd来作为嵌入式。这一些在未来都可以用来参考的。
关于移植FreeRTOS,动手前最好阅读一下官方网站这一篇文章
&&porting a freertos demo to different hardware&&
三.移植到S3C2440设备上
& 下一步我着手在我手里的S3C2440板上移植了 FreeRTOS,相对于ARM新的
RealView,更习惯用ADS.而且我机器上只有安装ADS。因此准备用这个编译器来编译了。
&&& 按照其规范,我首先在Source\portable目录下建立了 ADS\ARM9_S3C2440目录。
&&& 然后在Demo目录下建立 ARM9_S3C2440_ADS目录.
&& 3.1 创建自己的portable代码。
&&&&&&&& FreeRTOS主要实现
portmacro.h/port.c,可以参考一个ARM7的类似代码。最好从RVDS目录下选一个,因这两个工具很多基本是一样的,包括汇编语法。我选用的ARM7_LPC21xx作为模板.
经过检查,这一份代码基本是ADS类似的语法。象关中断,开中断都是用ARMCC的内部函数,__disable_irq(),__enable_irq();但是寄存器宏名字有较大的调整。
&&&3.2 创建自己的Demo代码.
这个因FreeRTOS对于相互的格式并无太多要求。把S3C2440的测试代码的引导代码拿过来即可。但是需要调整对于内存分区的相应代码,因为FreeRTOS也要用这一部分。
&&&&可以参考DEMO/ARM7_LPC2129_Keil_RVDS这一部分代码来调整。
&&& 我是把原来上课测试的LED测试代码直接搬过来的.
&&& 一编译有大量错误。因为我LED代码是测试工作正常。因此我觉得变换一下移植策略.即在已经运行成功的代码上没断调整变成符合RTOS
API的代码。这样好处是我不断看到成功的结果,并能滚动开发。
3.3 第一次移植,调整LED控制代码
&&&在很多demo项目下有ParTest.c
用于GPIO口的一些应用测试,包括LED测试。这一些代码跟内核并无太多关联,但是为了方便以后的开发者。可以在没有移植内核前先把这一些API函数移植了,作为第一步。&&&
&参见Demo/common/ParTest.h,主要实现如下三个函数
&&&&&&&&&&&&&
&void vParTestInitialise( void ); //初始化
&void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed
portBASE_TYPE xValue );
&void vParTestToggleLED( unsigned portBASE_TYPE uxLED
& 3.3 时间频率及时间中断处理
&&&& 这里有一些宏的值是要根据target来设置的.主要在FreeRtosConfig.h当中。
&&&& #define configCPU_CLOCK_HZ&&&&( ( unsigned long ) BOARD_MCK )
#define configTICK_RATE_HZ&&&&( ( portTickType ) 1000 )
&&&& 时间中断在实时的OS起核心的调度作用,必须一启动OS时就要配置时间中断,相应代码在
port.c::prvSetupTimerInterrupt();
& 3.4 内存分区设定
&&在线编写中&&
(责任编辑:jackyhwei)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 []
本文出处: 作者:Andrew Huang
------分隔线----------------------------
将本文分享到微信
Give your Linux box a multicolored light you can see from across the room, and le...
系统原来用的是BOSCH_BMA222的gsensor, 现在要求换成使用MMA7660,我们...
DAVINCI技术所涉及的知识面是蛮广的。一个DSP,一个ARM,一堆的工...
Do you pine for the nice days of Minix-1.1, when men were men and wrote their own...
GCC编译需要GMP, MPFR, MPC这三个库,这三个库可以从ftp://gcc.gnu.or...
这里附上很久以前写的LTIB使用总结,学习资料主要来自飞思卡尔...还没有帐号? 赶紧
帖子用户版块本版
147/193156
150/108653
&(+5)
Powered by & Copyright Time now is:02-16 22:40 &
版权所有 Gzip enabled
Total 0.075995(s) query 4,

我要回帖

更多关于 freertos 的文章

 

随机推荐