没有合适的资源?快使用搜索试试~ 我知道了~
一些网友来信反映说ecos增值软件包的范例比较少,不太会用,希望增加详细的使用说明。其实很多关于ecos的书上都有使用方法的介绍,不过考虑到很多用户第一次使用ecos,我还是觉得有必要再给出一些详细的使用说明。因为网友的问题重复的比较多,就不一一回信了,统一写成文档共享。主要想说明线程、IO操作、中断、TCP/IP协议栈、文件系统、GUI等的使用方法及其他感觉有必要阐述的内容。
资源详情
资源评论
资源推荐
ecos 增值包 fs minigui tcp 文件系统 内存管理 uart 中断 easyarm
ecos 增值软件包的详细使用说明
2006/12/27 asdjf@163.com www.armecos.com
一些网友来信反映说 ecos 增值软件包的范例比较少,不太会用,希望增加详
细的使用说明。其实很多关于 ecos 的书上都有使用方法的介绍,不过考虑到很
多用户第一次使用 ecos,我还是觉得有必要再给出一些详细的使用说明。因为
网友的问题重复的比较多,就不一一回信了,统一写成文档共享。主要想说明
线程、IO 操作、中断、TCP/IP 协议栈、文件系统、GUI 等的使用方法及其他感
觉有必要阐述的内容。
在开始前先回答网友的几个问题。
1、ecos for smartarm2200 经常死机的原因是 PSRM 读写速度比较慢(它内部用
SDRAM,外部是 SRAM 接口,性价比高?),用较高速度访问时容易出现采样
错误,把 PSRAM 读写访问长度各增加 1 个时钟周期后,系统就很稳定了,不
再出现死机现象,升级版本已经提供。
2、关于在裸机上跑 ping、TFTP、xmodem,我没有单独做过,不过 redboot
本身就是不带内核的 ecos 应用程序,其源码可以直接用在裸机上,这部分源码
在 ecos 中已经提供了,自己看看吧。您发来的程序,我实在没时间分析了:-(
3、关于单片机实现“TELNET 服务端”方面的程序资料,我没有具体的文字资
料,不过 redboot 支持 telnet,建议直接看源码。
4、关于 monitor 监控程序的实现原理,主要就是用软件中断指令替换断点处
的语句,引发异常中断后进入处理程序,收集现场信息,然后通过通信接口部
分传送到宿主机显示出来。难点是单步 step 调试断点的插入需要知道下一条语
句的位置,不过好在有跟踪 T 标志,实现就容易多了。GDB 的使用和串行通信
协议见《Debugging with GDB》。软件包里提供了全部实现源码。
*********************
* 第一讲 多任务编程 *
*********************
第一次使用 ecos,当然要先编个 hello 程序啦。那就编个多任务的,恩,3 个
线程任务同时打印信息,A 线程每秒打印一次,B 线程每 3 秒打印一次,C 线程
每 6 秒打印一次。
这个程序在 ucos51 演示程序中也有,就是 demo1。现在来比较一下二者的异
同。
从总体看,ecos 和 ucos 的应用程序大同小异,都有线程/任务创建、线程/任
务函数、堆栈等内容,只是 API 函数名字不同。
ecos 应用程序没有从 main 开始,而是从 cyg_start 启动,在 cyg_start 中创建
test 线程,再在 test 中创建 3 个实际的工作线程。
ecos 的命名规则很有层次感,比如:cyg_thread_delay(),cyg 表示 cygnus 公
司出品,thread 表示这个函数是与线程相关的(如:线程创建、延时),delay 表
示延时。怎么样?是不是很好记忆。比 ucos 的 OSTimeDly 好记吧!所有 cygnus
公司提供的 API 函数前面都带 cyg 前缀,你自己写的函数可以加上你的标识前
缀,如我自己定义的函数前加 yy 前缀。
cyg_thread_create(//创建线程
线程优先级,
线程函数指针,
线程函数参数,//对应线程函数的(cyg_addrword_t data)入口参数
线程名,22222 //用于调试目的
堆栈基址,
堆栈大小,
线程句柄,
保存此线程内核数据结构的存储空间
);
cyg_thread_resume(线程句柄); //线程恢复
cyg_thread_delay(延时时间); //以 10ms 为单位
cyg_scheduler_start(); //启动调度器开始工作。该函数被调用后不会返回,
类似 ucos 中的 OSStart();
好了,第一个程序就是这么简单,跟 ucos 很像吧,其实,所有的 RTOS 都差
不多的,只是函数名字不同罢了。ecos 和 ucos 一样都是直接使用平板内存,没
有特权概念,不过,ecos 比 ucos 更高级,包含了 TCP/IP 栈、文件系统、GUI,
功能也更强大,可以用 C++开发。这个演示应用程序可以不加修改地用在任何
支持 ecos 的平台上,例如:EASYARM2200 和 SMARTARM2200 上的运行效果是
一样的,这就是 OS 的好处,不用再关心定时器初始化,串口编程,抹平了硬件差
异,令编程如此简单,EASY。
下面是测试程序运行结果,Demo 程序创建了 3 个任务 A、B、C,优先级全
为 10,A 每秒显示一次,B 每 3 秒显示一次,C 每 6 秒显示一次。从显示结果
看,显示 3 个 A 后显示 1 个 B,显示 6 个 A 和 2 个 B 后显示 1 个 C,结果显然正
确。
RedBoot> lo -b 0x81010000 -r -m xmodem
Raw file loaded 0x81010000-0x810252cb, assumed entry at 0x81010000
xyzModem - CRC mode, 679(SOH)/0(STX)/0(CAN) packets, 2 retries
RedBoot> go 0x81010000
+
*******************************
* Hello! The world. *
*******************************
AAAAAA111111 is active.thread data is 1.
BBBBBB333333 is active.thread data is 2.
CCCCCC666666 is active.thread data is 3.
AAAAAA111111 is active.thread data is 1.
AAAAAA111111 is active.thread data is 1.
BBBBBB333333 is active.thread data is 2.
AAAAAA111111 is active.thread data is 1.
AAAAAA111111 is active.thread data is 1.
AAAAAA111111 is active.thread data is 1.
CCCCCC666666 is active.thread data is 3.
BBBBBB333333 is active.thread data is 2.
......
完整的测试源程序如下:demo1.c
#include <cyg/kernel/kapi.h>
#define STACK_SIZE 4096
char stack[4][STACK_SIZE];
static cyg_thread thread_data[4];
static cyg_handle_t thread_handle[4];
void taska(cyg_addrword_t data)
{
int message = (int) data;
for(;;)
{
printf("\tAAAAAA111111 is active.thread data is %d.\n",message);
cyg_thread_delay(100);
}
}
void taskb(cyg_addrword_t data)
{
int message = (int) data;
for(;;)
{
printf("\tBBBBBB333333 is active.thread data is %d.\n",message);
cyg_thread_delay(300);
}
}
void taskc(cyg_addrword_t data)
{
int message = (int) data;
for(;;)
{
printf("\tCCCCCC666666 is active.thread data is %d.\n",message);
cyg_thread_delay(600);
}
}
void
test(cyg_addrword_t data)
{
printf("\n\n\n");
printf("\t *******************************\n");
printf("\t * Hello! The world. *\n");
printf("\t *******************************\n\n\n");
// Create a main thread, so we can run the scheduler and have time 'pass'
cyg_thread_create(10, // Priority - just a number
taska, // entry
1, // entry parameter
"taska", // Name
&stack[1], // Stack
STACK_SIZE, // Size
&thread_handle[1], // Handle
&thread_data[1] // Thread data structure
);
cyg_thread_resume(thread_handle[1]); // Start it
// Create a main thread, so we can run the scheduler and have time 'pass'
cyg_thread_create(10, // Priority - just a number
taskb, // entry
2, // entry parameter
"taskb", // Name
&stack[2], // Stack
STACK_SIZE, // Size
&thread_handle[2], // Handle
&thread_data[2] // Thread data structure
);
cyg_thread_resume(thread_handle[2]); // Start it
// Create a main thread, so we can run the scheduler and have time 'pass'
cyg_thread_create(10, // Priority - just a number
taskc, // entry
3, // entry parameter
"taskc", // Name
&stack[3], // Stack
STACK_SIZE, // Size
&thread_handle[3], // Handle
&thread_data[3] // Thread data structure
);
cyg_thread_resume(thread_handle[3]); // Start it
}
void
cyg_start(void)
{
// Create a main thread, so we can run the scheduler and have time 'pass'
cyg_thread_create(10, // Priority - just a number
test, // entry
0, // entry parameter
"test", // Name
&stack[0], // Stack
STACK_SIZE, // Size
&thread_handle[0], // Handle
&thread_data[0] // Thread data structure
);
cyg_thread_resume(thread_handle[0]); // Start it
cyg_scheduler_start();
}
剩余63页未读,继续阅读
martintian
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- HandTrackingModule.py
- Python基于卷积神经网络的鸟类识别项目源代码,ipynb文件
- 批量将py编译为pyd文件.atbx
- Python项目-学生管理系统
- 图像处理基于matlab图像RGB三色合成分离【含Matlab源码第1发】
- verilog HDL硬件语法设计包括算术运算三人表决器Verilog的阻塞和非阻塞赋值源码例程quartus13.1工程合集
- 【文章话题分类论文】OpenAlex Topic Classification Whitepaper
- linux学习常用命令
- 功率拓扑快速参考指南-ti,TI官方出品
- 开源2023电赛国赛运动目标控制(E题)视觉部分
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0