随着嵌入式应用的普及,嵌入式操作系统的问题日益引人关注。由于DSP代表了一类重要的嵌入式应用,以DSP为核心的嵌入式操作系统也正在成为人们研究的热点。为了对自己的DSP产品提供软件支持,TI公司发行了DSP/BIOS程序包。但是关于DSP/BIOS的定位却存在分歧。一方面,在TI的正式资料和文档中均回避把DSP/BIOS称为实时操作系统,另一方面,为了满足在DSP应用中对操作系统环境的迫切需求,TI及其产品的用户均将DSP/BIOS视为一个“简单的”实时操作系统。

  事实上DSP/BIOS并不是真正的实时操作系统,而只是用于帮助程序员开发实时操作系统的软件包。而且,它不包含网络功能。所以,在用DSP/BIOS设计网络操作系统时,需要从两方面入手:一,利用DSP/BIOS提供的资源进行裁减和整合;二,补充DSP/BIOS中未能提供的网络功能。

  1 DSP/BIOS的构成

  一般认为DSP/BIOS由三部分内容组成,即
  1)DSP/BIOS实时库和API
  2)DSP/BIOS配置工具
  3)DSP/BIOS插件

  其中配置工具用于提供可视化的编程环境,而插件用于支持调试过程。所以,实时库和API才是DSP/BIOS的核心。DSP/BIOS实时库可以为最终生成的嵌入式实时操作系统提供运行时的基本服务,包括线程调度,中断管理等功能。DSP/BIOS API由十几个模块组成,如DEV设备驱动接口,MEM存贮段管理器等。程序员通过调用API来使用DSP/BIOS。

  DSP/BIOS API由十几个模块组成,每个模块又由相关的数据结构和函数组成。在有关DSP/BIOS的资料中混杂使用了模块(module)、对象(object)等术语,不过,DSP/BIOS与面向对象技术并没有直接的关联。所谓模块,是指一个逻辑上的概念,表示一组数据结构和以此为基础的一组函数。对象则是特指按模块中的数据结构所创建的变量(与C++中的类与对象不是同一个概念)。

  如果程序员定义了某个对象,他将可以使用模块中的相应函数,并用这些函数代码来组成自己的嵌入式操作系统。

  在程序员开发自己的嵌入式操作系统时,一般不会同时需要DSP/BIOS的全部模块。所以,DSP/BIOS中的内容是按需使用的。但是,开发平台会自动选择部分核心模块,并为它们创建对象。例如,开发平台会自动选择任务管理器( Multi-Task Manager)模块,以支持空闲处理功能:TSK_idle (),即:
  TSK_Obj TSK_idle (iFXN, iARG0, iARG1, iARG2, iARG3, iARG4, iARG5, iARG6, iARG7, iAUTOSTK, iMANSTK, iSTKSZ, iSTKSEG, iPRI, iENV, iEXITFLAG, iUSETSKNAME, iSTATREG)

  由DSP/BIOS实时库生成的代码和程序员新编制的代码链接到一起就构成了DSP的嵌入式应用系统。这些代码之间的执行关系由boot.c文件规定,该文件的缺省执行顺序为:
  一,初始化DSP:由复位中断向量将程序引导到c_int00,开始初始化寄存器等硬件资源;二,初始化DSP/BIOS模块:通过调用BIOS_init完成,BIOS_init由开发平台中的配置工具自动生成;三,初始化用户应用环境:通过调用main例程实现;四,启动DSP/BIOS:由BIOS_start启动由DSP/BIOS实时库中的相关例程,BIOS_start也是由开发平台中的配置工具自动生成的。但是,通过调整boot.c可以改变系统的执行顺序。

  2 NDK开发环境

  为了加速其高档DSP的网络化进程,TI结合其C6000系列推出了TCP/IP NDK (Network Developer’s Kit)。该开发包采用紧凑的设计方法,实现了用较少的资源耗费支持TCP/IP。从实用效果看,NDK仅用200-250K程序空间和95K数据空间即可支持常规的TCP/IP服务,包括应用层的telnet,DHCP,HTTP等。所以,NDK很适合目前嵌入式系统的硬件环境,是实现DSP上网的重要支撑工具。

  与常规的TCP/IP应用环境不同,为了最大限度地减少资源消耗,TI为其NDK采用了许多特殊技巧,例如:低层驱动程序与协议栈之间通过指针传递数据,不对包进行复制考贝。因为在嵌入式系统中,低层驱动程序和应用程序一样均需要开发者自行设计。也就是说,在以NDK为基础的开发中,开发人员需要分别设计低层驱动程序和应用程序,这两部分程序通过NDK提供的TCP/IP包发生关联。程序的执行过程是:应用程序调用TCP/IP包,TCP/IP包再调用低层驱动程序。

  在NDK中对低层驱动程序与TCP/IP包之间的接口作了明确规室,换言之低层驱动程序必须符合接口约定。以PPP为例,其要点是:
  1)由低层驱动程序调用TCP/IP包函数创建PPP连接实例,在连接实例中,以回调函数的形式将用于处理数据发送的函数名传递给TCP/IP包;
  2)当TCP/IP包有数据需要发送时,直接调用PPP创建时由低层驱动程序传递来的函数名;
  3)当低层驱动程序接收到网络数据时,调用TCP/IP包函数发送到IP层。

  低层驱动程序直接面向硬件,为了适应硬件的多样性,在NDK中也提供了多种实现低层连接的方法,也为用户设计符合自己硬件特点的低层连接提供了接口规范。

  3 利用NDK增加网络功能

  如何在嵌入式系统中增添DSP/BIOS实时库中没有的功能是设计基于DSP/BIOS的实时操作系统中最主要的问题之一。解决这个问题一般需要两个步骤:一,程序员定制开发代码;二,与系统中的其它功能绑定在一起。现在,我们介绍如何利用NDK为其增加网络功能。

  与常规的TCP/IP开发不同,在开发嵌入式应用时,开发人员必须对网络环境和应用需求作更细致的设置。在以NDK为基础的开发中,程序员需要完成的主要工作有:
  1) 通过DSP/BIOS.cdb或DSP/BIOS API调用NETCTRL任务线程。该线程不是直正的网络任务线程,它以初始化线程的形式出现,起TCP/IP协议栈的事件调度线程的作用。
  2) 调用初始化函数NC_SystemOpen()。该函数完成对协议栈其及所需要的内存的初始化。
  3)创建系统配置。该系统配置用于对协议栈的控制和管理,可用CfgNew()和CfgLoad()等函数操作。
  4)调用NETCTRL函数NC_NewStart()启动网络。NC_NewStart()函数的参数中包含三个回调函数指针,分别处理“Start”,“Stop”和“IP Address Event”事件,其中“Start”和“Stop”只执行一次,“IP Address Event”则响应每次IP地址的变化。

  由于NDK已经提供了完整的TCP/IP库函数,程序员开发的代码只须按需要进行配置即可。下面是将嵌入式设备配置为车间局域网节点的核心代码:

char *LocalIPAddr ="128.247.117.12";
char *LocalIPMask ="255.255.254.0";
char *GatewayIP ="128.247.116.1";
char *DomainName ="demo.net";
int NetworkConfig()
{
  int rc;
  CI_IPNET NA;
  CI_ROUTE RT;
  HANDLE hCfg;
  NC_SystemOpen();
// Create a new configuration TCP/IP Stack Initialization and Configuration
  hCfg = CfgNew();
  if( !hCfg )
  { goto main_exit; }
// Manually configure our local IP address
  bzero( &NA, sizeof(NA) );
  NA.IPAddr = inet_addr(LocalIPAddr);
  NA.IPMask = inet_addr(LocalIPMask);
  strcpy( NA.Domain, DomainName );
  NA.NetType = 0;
// Add the address to interface 1
  CfgAddEntry( hCfg, CFGTAG_IPNET, 1, 0,
  sizeof(CI_IPNET), (UINT8 *)&NA, 0 );
// Add the default gateway.
  bzero( &RT, sizeof(RT) );
  RT.IPDestAddr = 0;
  RT.IPDestMask = 0;
  RT.IPGateAddr = inet_addr(GatewayIP);
// Add the route
  CfgAddEntry( hCfg, CFGTAG_ROUTE, 0, 0,
  sizeof(CI_ROUTE), (UINT8 *)&RT, 0 );
  do
  {
  rc = NC_NetStart( hCfg, NetworkStart, NetworkStop, NetworkIPAddr );
  } while( rc > 0 );
// Delete Configuration
  CfgFree( hCfg );
// Close the OS
  main_exit:
  NC_SystemClose();
  return(0);
}

  为了让NetworkConfig与系统中的其它功能绑定在一起,可以通过开发平台创建一个TSK任务管理器对象,并将其定义为一个独立的线程任务。这样,TCPStackStart就加入到嵌入式系统中了。

2008.10.27

The basic process of stack initialization is as follows:

l         用初始化函数对操作系统环境进行初始化。NC_SystemOpen()

l         创建一个新配置:CfgNew()

l         通过配置函数API调用来构建新配置或加载一个原来存在的配置CfgLoad()。

l         启动带配置的堆栈NC_NetStart( hCfg, pfnStart, pfnStop, pfnNetIP )

l         一些主要的初始化后NC_NetStart()产生一个新的线程(调用用户的回调函数),产生网络要求的任务线程。

l         正常工作下,网络不会关闭(直到调用NC_NetStop()),当在某点调用NC_NetStop() 时,原先NC_NetStart() thread 调用用户回调函数来停止,

l         运用程序可以在再次调用NC_NetStart()时立即重新启动,而不需要重载一个新的配置。

l         当NC_NetStart()返回 and the session is over 时,调用CfgFree() 释放配置句柄。

l         所有资源被释放后,调用NC_SystemClose()来完成系统关闭。

2009.3.9

1、

int CfgAddEntry(HANDLE hCfg, uint Tag, uint Item, uint Mode, uint Size, UINT8 *pData,

HANDLE *phCfgEntry);

功能:为配置创建一个新的配置入口。

参数:

hCfg- Handle to configuration配置句柄

Tag -Tag value of new entry 新入口的标签值

Item -Item value of new entry 新入口的项目值

Mode- Mode flags for how to add entry 如何增加入口的模式标志

Size- Size of entry data pointed to by pData 入口数据大小

pData -Pointer to entry data  入口数据指针

phCfgEntry- Pointer to where to write handle of new configuration entry

返回值:(四种情况)

1-Returns 1 on success with successful processing by a service callback function。

0-Returns 0 on success with no processing performed by a service callback function

CFGERROR_SERVICE<返回值<0 的情况有三种如下:

       CFGERROR_BADHANDLE   Invalid hCfg handle

CFGERROR_BADPARAM    Invalid function parameter

CFGERROR_RESOURCES   Memory allocation error while adding entry

小于CFGERROR_SERVICE

备注:To modify the default behavior, one or more of the following flags can be set:

CFG_ADDMODE_UNIQUE :Replace all previous entry instances with this single entry.

CFG_ADDMODE_DUPLICATE :Allow full duplicate entry (duplicate Tag, Item, and entry data). Requests to add duplicates are normally ignored.

CFG_ADDMODE_NOSAVE :Do not include this entry in the linear buffer in CfgSave().

2、

void CfgFree(HANDLE hCfg);

参数:hCfg Handle to configuration

描述Destroys a configuration. Unloads and frees all configuration entries and frees theconfiguration handle. After this call, the configuration handlehCfg is invalid.

3、

int CfgLoad(HANDLE hCfg, int Size, UINT8 *pData);

功能:把一线性存储块转化为一个配置。(通过配置入口来实现)

参数:

  hCfg -Handle to configuration

Size -Size of memory block to load

pData -Pointer to memory block to load

返回值:Returns the number of bytes loaded, or less than 0 on an error. CFGERROR_BADHANDLE :InvalidhCfg handle

CFGERROR_BADPARAM :Invalid function parameter

4、

HANDLE CfgNew();

功能:创建一个新配置。这个配置可以被配置函数作为参数,

返回值:Returns handle to a new configuration or NULL on memory allocation error.

基于DSP/BIOS和NDK的嵌入式网络操作系统设计方案相关推荐

  1. linux 远程挂载摄像头_基于Linux的嵌入式网络摄像机设计

    本嵌入式网络摄像机采用高性能ARM9芯片微处理器,内置嵌入式Web服务器. 通过嵌入式多任务操作系统采集摄像机视频数据:采集的视频信号数字化后经MJPEG算法压缩,再通过内部总线送到内置的Web服务器 ...

  2. DSP/BIOS入门

    转载自 http://blog.chinaunix.net/uid-20620288-id-3379093.html 1          DSP/BIOS简介 DSP/BIOS是CCS中集成的一个简 ...

  3. DSP/BIOS简介

    1          DSP/BIOS简介 DSP/BIOS是CCS中集成的一个简易的嵌入式实时操作系统,能够大大方便用户编写多任务应用程序.DSP/BIOS拥有很多实时嵌入式操作系统的功能,如任务的 ...

  4. dsp/bios初步了解

    1          DSP/BIOS简介 DSP/BIOS是CCS中集成的一个简易的嵌入式实时操作系统,能够大大方便用户编写多任务应用程序.DSP/BIOS拥有很多实时嵌入式操作系统的功能,如任务的 ...

  5. DSP/BIOS设计指导书

    DSP/BIOS设计指导书 1 概述 CCS是TI的DSP芯片集成开发环境,v3.2版本中集成了DSP/BIOS v5.21,支持Himalaya TCI6482芯片. 下面对CCS v3.2和DSP ...

  6. 基于DSP+FPGA高速运动控制器设计

    基于"PC+运动控制器"结构的开放式机器人运动控制系统能够充分利用PC开放程 度高.通用性好.处理能力强等特点以及运动控制器运算速度快.实时性能好.控制能 力强等特点,因此得到较快 ...

  7. arm linux嵌入式网络控制系统,基于ARMLinux的嵌入式网络控制系统的研究与设计

    摘要: 随着计算机技术.控制技术和网络技术的蓬勃发展,嵌入式系统与网络控制系统的应用越来越广阔.当前控制系统正经历一场前所未有的变革,远程监控和智能控制成为控制系统发展的重要方向.通过嵌入式网络控制系 ...

  8. arm linux嵌入式网络控制系统,基于ARM uCLinux的网络控制系统设计与实现

    引言    随着网络和通信技术的发展,嵌入式系统现已进入高速发展阶段.并在社会各个领域得到了广泛的应用.本文介绍了一种采用ARM+uCLinux作为开发平台.实现基于TCP/IP的远程系统监控.从而取 ...

  9. 基于嵌入式系统linux无线传感器网络软件平台,基于嵌入式网络的无线传感器网络平台硬件和软件实现...

    简要介绍资料的基于嵌入式网络的无线传感器网络平台硬件和软件实现主要内容,以获得更多的关注 随着技术的发展,基于分布式.无线传感器网络的应用也越来越多.本文提出了一个基于嵌入式系统的无线传感器网络实验平 ...

最新文章

  1. LA 2218 (半平面交) Triathlon
  2. formal method revision
  3. 深度linux引导安装,全程演示Linux Deepin 12.06安装过程
  4. 如何在Outlook中的电子邮件上显示快速操作按钮
  5. Oralce 9.2.0.6 到 9.2.0.8 升级 小结
  6. inner join 重复数据_Ramp;Python Data Science 系列:数据处理(2)
  7. 头部互金科技负责人领路知识图谱
  8. 用于Power BI Desktop中的库存数据分析的烛台图
  9. benchmark如何测试mysql数据库_MySQL的benchmark函数
  10. php右下角弹窗代码,2019畅言最新去除隐藏右下角弹窗广告!代码添加彻底隐藏畅言右下角广告代码...
  11. 小米路由器3无线网连接到服务器,小米路由器3无线中继(桥接)怎么设置?
  12. 怎么添加校园邮箱到Outlook?
  13. leach协议c++代码_leach和leach-c协议仿真
  14. java参数防篡改,Java程序防篡改器设计方案
  15. mysql数据库中邮箱的属性_MySQL——数据库的操作、属性
  16. 吴恩达《深度学习》课程介绍
  17. 从女孩儿手中音乐般滑落
  18. Python通过类的组合模拟街道红绿灯
  19. 使用电子邮件营销可以更快速推广餐厅
  20. 《大数据技术与应用》课程记录

热门文章

  1. 第十五届全国大学生智能车竞赛 室外光电组线上选拔赛比赛流程
  2. html,css,js小实例,CSS和JavaScript脚本实例
  3. 规则引擎 drools_为什么要用规则引擎?
  4. cpu多核 node 单线程_详解node单线程实现高并发原理与node异步I/O
  5. aes加密内容不定长_浅谈加密技术
  6. oracle的clob赋值_Java处理(插入或修改)clob类型数据
  7. linux下查看vnc端口_怎样查vnc端口,Linux下根据进程名怎样查端口
  8. java中的foreach_java中的foreach语句
  9. python小知识_python-小知识点积累(持续更新)
  10. pc端汽车obd软件下载?_常用的ERP软件电脑端下载