`
mmdev
  • 浏览: 13300208 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

.Net Micro Framework中的线程

阅读更多

.Net Micro Framework中的线程

March 19, 2009

黄季冬

http://fox23.cnblogs.com/

摘要

新一代嵌入式微框架.Net Micro Framework提供了对线程调度的支持,和它的两位前辈(.Net Framework, .Net Compact Framework)相比,Micro Framework并不需要依赖于OS提供的线程管理的服务,因为Micro Framework本身就是一个“操作系统”。本文介绍了Micro Framework中的多线程原理,以及.Net Micro Framework中WPF的多线程编程。

简介

作为.NET家族的一名新成员,.Net Micro Framework是微软专门针对超轻量级平台(主要是一些低端的32位微处理器)设计的软件架构。其结构如图1:

图1. .Net Micro Framework 架构

.Net Micro Framework有且仅有一条本地执行线程,这条线程上跑的就是.Net Micro Framework CLR(TinyCLR)。TinyCLR是一个可以自己引导的运行环境,和完整版本的.Net一样会管理它自己涉及的内存。所以可以认为.Net Micro Framework不需要依赖操作系统提供线程和内存管理的服务。所以,完全可以把.Net Micro Framework移植到没有OS,甚至没有内存管理单元(MMU)的某些ARM7处理器上。

尽管只在单一的线程上执行,但是CLR要求对驱动的调用“看起来”是异步的,也就是说这些调用会立即返回,而不是一直阻塞直到该任务的硬件I/O完成。这和Windows下的APCasynchronous procedure call)的实现非常类似。TinyCLR的线程调度依赖于APC的完成模式,APC的实现依赖于图1中PAL层的定时器(Timer)的实现,如图2。

图2. .Net Micro Framework上的异步调用

Micro Framework的基本线程操作

下面先简单介绍几种最基本的,在.Net Micro Framework被支持的线程相关方法:

1. Join

和完整版的.Net Framework一样Micro Framework的System.Threading.Thread类提供了Join方法,所谓join(合并)用于使当前线程等待直至调用该线程的方法执行完毕或者到达指定的等待时间,这里不做多的介绍了。

2. Timer

这里是说System.Threading.Timer类,和完整版的.Net Framework一样它的构造函数中提供了一个TimerCallback委托类型的参数。它告诉线程池要拿出一个线程来按特定的时间或者频率执行这个callback函数。

3. Event

Micro Framework中线程可以用事件的方式来响应, 比如在访问一些共享资源的时候可以使用AutoResetEvent, 通过Wait-Set的组合来同步线程。

以上几种基本操作,在SDK的Threading例程中都有使用,这里不再赘述。

(Microsoft .NET Micro Framework\Samples\Threading )

WPF与Dispatcher

初次接触.Net Micro Framework那WPF风格的UI编程模型时(没有Windows Forms),总是面临着许多性能和安全上的问题。其中很常见的就是数据更新和界面刷新的问题。

典型的有UI的Micro Framework应用程序都会有两个逻辑线程,一个是开发者显式创建用来处理硬件I/O的。另一个是由TinyCLR隐式创建并维护的,它用来处理所有的UI操作,我们姑且把it叫做WPF UI线程例如绘制UI元素,绘制控件和窗体等。

Micro Framework中的UI元素的更新,可以使用Dispacther和DispatcherTimer以线程安全的方式访问UI元素。什么是Dispacther呢?你可以把它看作绑定在上述第二个线程上的一个消息队列,WPF UI线程一直盯着这个队列来接受各种操作命令。你只需要把你的命令,即相关待执行的函数,enqueue到这个队列。即可让这个函数获得线程安全的执行。

下面我们通过一个时钟的例子来说明如何在Micro Framework中使用Dispatcher,在本例中我们会在一条单独的线程上更新画面上的文本。打开Visual Studio创建一个Micro Framework的windows程序

首先,在main函数之外,我们定义一个文本和负责更新它的线程:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privateTexttext;
privateThreadupdateThread;

然后,我们需要为这个更新操作定义一个委托,这个委托的实例将被用来添加到WPF UI的“消息队列”中去:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->///<summary>
///用来更新文本的委托
///</summary>
///<paramname="newText">新文本</param>
publicdelegatevoidUpdateTextDelegate(StringnewText);

然后我们需要一个该委托的实例指向的实际函数,它非常简单:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicvoidUpdateText(StringnewText)
{
text.TextContent
=newText;
}

接下来我们还需要让UpdateThread做点什么,就是要它通过Dispatcher来完成这个异步的线程安全的UI更新:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicvoidUpdateTextThread()
{
while(true)
{
this.Dispatcher.BeginInvoke(newUpdateTextDelegate(UpdateText),
newobject[]{DateTime.Now.ToString("hh:mm:ss")});
//休眠1秒
Thread.Sleep(1000);
}

}

最后,我们要在CreatWindow方法返回前,添加如下代码以启动上述线程:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->updateThread=newThread(newThreadStart(UpdateTextThread));
updateThread.Start();

其运行效果如下:

注意这里我为了能让大家看清楚,使用了较大的字体,如何为MF添加自定义的字体请参考:

http://www.cnblogs.com/fox23/archive/2008/10/20/customized-fonts-in-net-micro-framework.html

这种有周期的调用方式,还可以使用DispatcherTimer来处理,此时唯一需要改变的是UpdateText的签名,使之符合EventHander的格式:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicvoidUpdateText(objectsender,EventArgse)
{
text.TextContent
=DateTime.Now.ToString("hh:mm:ss");
}

使用DispatcherTimer非常简单:

<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> dispatchTimer=newDispatcherTimer(textView.Dispatcher);
dispatchTimer.Tick
+=newEventHandler(UpdateText);
dispatchTimer.Interval
=newTimeSpan(0,0,1);
dispatchTimer.Start();

Micro Framework并不胜任所有情况

对于一些高吞吐量,且对实时性要求比较高的情景(比如一个需要对音频数据流编解码输出CD音质的设备),使用Micro Framework设备做这些工作并不是一个好的选择。要满足这样的需求,你可以使用一些辅助的处理器(比如DSP),通过SPI或者I2C连接到Micro Framework设备。让它们去做繁重的数据处理工作,而使用Micro Framework来创建友好的UI并承担一些非严格实时性的工作。

另外一种方式就是把Micro Framework移植到一个多线程实时操作系统上,然后把那些实时性高的代码交给一条高优先级的线程去跑。

总结

NET Micro Framework 将 .NET 的可靠性和效率与 Visual Studio的高生产率结合起来,以针对价格较低、资源受限的小型设备开发应用程序,可帮助人们使用熟悉的 Visual Studio 工具来构建托管的嵌入式应用程序。从中你可以发现使用托管代码以OO的方式在嵌入式设备上面编写拥有漂亮的UI的多线程程序是如此简单自然。也许你再也不想回到过去那Win32或者POSIX风格的代码中去了。同时要注意Micro Framework的适用范围,注意避免由MF直接承担一些实时性较高的,大数据量的任务。

分享到:
评论

相关推荐

    Expert .NET Micro Framework(德 Jens Kühner)

    10. **应用程序模型**:介绍如何设计和构建符合.NET Micro Framework的应用程序模型,包括线程管理、事件处理和异步编程。 11. **案例研究**:书中可能包含实际的项目案例,展示了.NET Micro Framework在不同应用...

    GHI .NET Micro Framework培训教材(英文版)

    本教材《GHI .NET Micro Framework培训教材》专为初学者设计,旨在介绍.NET Micro Framework及其在嵌入式系统开发中的应用。教材详细介绍了如何使用C#语言进行编程,并提供了丰富的实例来帮助读者理解和掌握.NET ...

    Windows Embedded从入门到精通系列课程(6):深入探索 .NET Micro Framework 应用开发

    《深入探索 .NET Micro Framework 应用开发》是Windows Embedded从入门到精通系列课程的第六部分,这个课程旨在帮助开发者全面理解并掌握在嵌入式系统中使用.NET Micro Framework进行应用开发的技术和实践。...

    基于Cortex-M3处理器的.Net Micro Framework移植.pdf

    .NET Micro Framework(MF)是微软为嵌入式系统设计的一种软件框架,它基于.NET平台,提供了操作系统级别的功能,包括启动管理、中断处理、线程调度和内存管理等关键特性。MF设计目标是针对传统的SOC(System on ...

    Apress - Expert .NET Micro Framework (Apr 2008)

    《精通.NET Micro Framework》是一本深入探讨.NET Micro Framework(以下简称.NET MF)的专业书籍,由Apress出版社于2008年4月发行。这本书详细介绍了这个小型化、资源优化的.NET框架,它专为嵌入式设备和物联网(IoT...

    .NetMicro Framework的TCP/IP stack

    在.NET Micro Framework中,TCP/IP的实现有三种选择: 1. **无TCP/IP栈**:在这种模式下,系统不提供任何内置的TCP/IP支持,需要开发者自己实现或者依赖外部硬件或固件提供的网络功能。 2. **原生OS栈**:如果目标...

    44.zip_.net编程_C#_

    标题中的"44.zip_.net编程_C#"表明这是一个与.NET框架和C#编程语言相关的项目,而描述中提到的"Touch screen data logger for Chipworks board from GHI electronice (.NET micro framework)"则揭示了这个项目具体是...

    嵌入式系统/ARM技术中的嵌入版.Net源码被微软开放 已免除相关授权费

    这种跨平台的特性使得.NET Micro Framework成为开发跨硬件平台应用的理想选择,尤其是在嵌入式设备市场中,竞争日益激烈的环境下,如ARM平台上的Android兼容应用开发。 .NET Framework是微软开发和运行现代应用程序...

    wince arm9 c# gpio程序

    在.NET Micro Framework中,这些操作由`GpioController`类提供支持。 3. **中断处理**:有些GPIO引脚支持中断功能,当状态变化时可以触发中断服务例程。在C#中,可以通过注册回调函数来处理这些事件。 ADC则是将...

    MINI2440 WINCE6 LED测试程序

    在WINCE6.0系统中,我们可以利用.NET Micro Framework提供的类库来访问GPIO。例如,可以使用`System.Device.Gpio`命名空间中的`GpioController`类来管理GPIO引脚。首先,创建一个`GpioController`实例,然后通过其`...

    第三节:基于C#使用开发板避障模块实验.zip

    C#通常被用于桌面应用和游戏开发,但通过.NET Micro Framework或Windows IoT Core,它也可以在微控制器上运行,实现物联网(IoT)项目。 首先,我们需要理解“避障模块”的基本原理。避障模块通常包含传感器,如...

    C#开发Android应用实战-使用Mono for Android和.NET C#(PDF中文扫描版下载,吾乐吧软件站分享)

    这个框架的核心是.NET Micro Framework和Mono运行时,它将.NET Framework的关键部分移植到了Android平台,使得开发者可以充分利用.NET的强大功能,同时享受到跨平台开发的便利。 本书的核心内容可能包括以下几个...

    微软嵌入式操作系统的分析和对比

    .NET MicroFramework的核心组件——CLR(Common Language Runtime),不仅负责执行管理代码,还承担着内存管理和线程调度的任务。这样的设计使得.NET MicroFramework的整体代码量非常小,约为250-500KB左右,非常...

    S7.Net动态链接库DLL.rar

    S7.Net动态链接库DLL是专门针对西门子S7系列PLC设计的一种通信库,它允许用户通过.NET Framework进行编程,实现与各种型号的西门子PLC(包括S7-200、S7-300、S7-400、S7-1200和S7-1500)的高效通信。这个DLL库为...

    UDP.zip_s3c6410_s3c6410 UDP

    在wince6.0中,可以通过.NET Micro Framework或者WinCE的API来访问这些硬件资源。 UDP通信的基本过程包括以下步骤: 1. **创建套接字**:在C编程中,可以使用`socket()`函数创建一个UDP套接字,指定协议为AF_INET...

    WINCE5和WINCE6的两个SDK

    这个版本支持多线程、硬件抽象层(HAL)以及对.NET Micro Framework的部分支持。值得注意的是,当在Win7环境下使用VS2008安装时,描述中提到为了避免安装失败,应避免选择安装"Documentation"组件,这可能是因为文档...

    Windows.Embedded.CE.6.0.Fundamentals

    CE 6.0引入了.NET Micro Framework,允许开发者使用C#和.NET类库进行开发,简化了编程过程。 接着,学习如何构建WinCE系统。这个过程中涉及的关键步骤包括:创建Platform Builder环境,这是一个集成开发环境(IDE)...

    Windows CE从入门到精通系列课程(18)

    最后,课程可能还会涉及Windows CE的最新版本和相关技术,如Windows Embedded Compact,以及与.NET Micro Framework的集成,这些都是Windows CE在物联网(IoT)领域的重要应用。 通过观看《WebCast20080924pm_Video...

    C#开发实用经验集

    3. **硬件编程应用**:C#不仅限于软件开发,还可以用于硬件交互,如通过.NET Micro Framework或Windows IoT Core进行嵌入式设备编程。这可能涉及到GPIO、SPI、I2C等通信协议的使用。 4. **SQL数据库**:在C#中,SQL...

    Windows phone8.0Md5加密类

    在Windows Phone 8.0平台上,由于.NET Micro Framework(用于WP8开发的框架)的限制,开发者无法直接使用.NET Framework中的MD5类进行加密操作。MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它可以...

Global site tag (gtag.js) - Google Analytics