最新要闻
- 信息:2022年跨境电商市场规模15.7万亿元
- 【环球时快讯】6499元买吗?雷军晒小米13 Ultra限量定制色真机上手图:网友大呼背刺
- 家用强力灭蚊!雅格充电电蚊拍10.9元起狂促_报资讯
- 世界聚焦:“五一”假期日均125.3万人次出入境
- 奈雪五一小长假订单同比上涨120% 部分门店涨幅超800%|热资讯
- 【天天热闻】五一18人预付9600元订民宿遭毁约!青岛市监局立案调查
- 环球视讯!4月百城二手住宅价格跌幅扩大:挂牌量持续走高 房价走势承压
- 环球快资讯丨来了乌鲁木齐,相当于去了中东石油富豪区消费?
- 全面看齐新7系!宝马新一代5系G60外观、内饰首度公开亮相:发光双肾抢眼-全球速讯
- 门密码锁怎么加入指纹?第一次使用记住这4点 环球讯息
- 博安生物(6955.HK):地舒单抗注射液国际3期临床试验完成首例受试者入组|今日视点
- 纤薄身材也能满血发挥!耕升RTX 4070踏雪评测:2K游戏通吃的高颜值显卡 环球关注
- 购燃油车就送粤A蓝牌!广汽集团在广州推限时购车补贴
- 看不下去AI胡说八道 英伟达出手给大模型安了个“护栏”
- 世界通讯!鼠目寸光是什么生肖_鼠目寸光的意思及造句
- 2023山东东营市广饶县事业单位招聘面试通知书领取通知
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
在Zynq平台上使用uCOS [原创www.cnblogs.com/helesheng]-天天热文
uCOS是我个人熟悉和喜欢的操作系统,从最早的C51到后来的LPC2000和STM32,uCOS-II或uCOS-III都是我进行产品开发的首选的实时操作系统。但却从未尝试过在全可编程片上系统(APSoC)上使用过uCOS,这几天心血来潮想来试试看。却发现采用Zynq + uCOS的工程师并不多,网上虽然有一些介绍文章,但照着操作做后依然存在这样那样的问题。这篇博文将我使用Zynq + uCOS方案时遇到的问题罗列一下,供后来者参考。由于也是浅尝而止,如果用这个方案开发产品,估计还会有大量的问题,以后遇到再逐渐补齐吧,也欢迎网友们在评论区指出和补充。
(相关资料图)
以下原创内容欢迎网友转载,但请注明出处: https://www.cnblogs.com/helesheng
一、在SDK中配置Zynq-7000上的uCOS的开发环境
uCOS的开发商Micrium公司(现已被Silicon Labs公司收购)已经帮助大家将uCOS-II和uCOS-III移植到了常见的所有品牌处理器包括Zynq-7000上。大家可以到Silicon Labs公司的网站的相关连接(https://www.silabs.com/developers/micrium)上直接下载。但下载需要有Silicon Labs公司的账号,不知为什么我用QQ邮箱和学校教工的邮箱都没法收到Silicon Labs的确认邮件只好作罢。在GitHub上找到一个网友分享的链接:https://github.com/suisuisi/zynq_guide/tree/main/ucos,下载到了一个mirium的压缩包ucos_v1_45.7z,在此对不知名的朋友表示感谢。
下载并解压后得到如下图所示的目录结构。
在Zynq的软件开发工具SDK中可以配置uCOS的开发环境,从而在SDK中新建应用时直接生成uCOS-II或uCOS-III的应用工程。具体方法是,在SDK的主菜单中单击Xilinx->Repositories,在Local Repositories栏中导入刚才解压的uCOS开发包。但需要注意的是,指定的路径必须到压缩包中的../ucos/文件夹下,如下图所示,否则SDK将找不到新建工程的模板。
二、建立一个验证ucos实时操作系统的简单的Zynq硬件系统
做一个ucos简单的多任务演示系统,不同任务控制不同GPIO点亮不同的LED,方便观察。我用的开发板是PYNQ-Z2,MIO没有连接到足够的LED,用EMIO来连接LED。具体步骤如下:
1、新建Vivado工程,创建Block Design,在Block Design中添加ZYNQ7 Processing System IP核。
2、配置ZYNQ7 Processing System IP核。我直接使用了PYNQ-Z2预置的配置文件pynq_revC.tcl。
加载预置的配置文件后,需要手动将官方配置文件没有引出的EMIO引出2个。完成下图所示的配置后,单击OK在Block Design界面中就可以找到ZYNQ处理器模块上的GPIO端子了。
3、为EMIO添加输出连接端口。并通过约束文件将这两个EMIO连接到PYNQ-Z2上的LED上。
#LED_PS
set_property -dict {PACKAGE_PIN N16 IOSTANDARD LVCMOS33} [get_ports {GPIOA_tri_io[0]}]
set_property -dict {PACKAGE_PIN M14 IOSTANDARD LVCMOS33} [get_ports {GPIOA_tri_io[1]}]
4、综合并产生二进制配置文件,并将其导出。
三、在SDK中开发uCOS代码
1、启动SDK开发环境,选择新建应用工程,此时弹出的新建工程向导如下图所示。
和之前的新建应用工程最大的不同是OS Platform下拉菜单中多了一个ucos的选项。选择ucos选项,并输入工程名称后单击Next,进入新建工程模板选择窗口。在下图所示的工程模板选择窗口中选择的Micrium uC/OS-II Hello World或Micrium uC/OS-III Hello World工程模板。
2、修改ucos工程模板创建工程的标准输入/输出设备
不知什么原因,Micrium的模板并未将标准的输入输出设备指定为调试的uart0口。这将导致直接编译运行该工程模板后无法看到输出的Hello World。修改起来也非常容易:双击刚才新建的应用工程的板级支持包(BSP)工程的配置文件system.mss(在左侧导航窗口的bsp工程下)。在弹出的下图界面中单击Modify this BSP’s Setting。
在随后弹出的配置窗口如下图所示,在左侧选择ucos_standalone。在右侧stdin/stdout(标准输入/输出)设备都选择为ps7_uart_0。
3、在工程模块框架下编写任务代码
嵌入式系统中,实时操作系统所起到的最核心作用就是管理和分配系统中的各种资源,尤其是嵌入式系统最为重要的资源:CPU的时间。uCOS以“任务”作为CPU时间分配的基本对象。程序员在开发单个uCOS任务时,最重要的“心法”就是:认为本任务独占CPU。
为实现上述控制两个独立的LED采用不同频率闪烁的目标,我设计采用两个任务各自控制一个LED,它们各自按照自己的节奏延时和刷新EMIO状态。两个任务的代码如下:
1 //控制LED0的亮灭. 2 void TaskLed(void *pdata) 3 { 4 while(1) 5 { 6 XGpioPs_WritePin(&psGpioInstancePtr, 54, 1);//EMIO的第0位输出1 7 OSTimeDly(300); 8 XGpioPs_WritePin(&psGpioInstancePtr, 54, 0);//EMIO的第0位输出0 9 OSTimeDly(300);10 }11 }12 //控制LED1的亮灭.13 void TaskLed1(void *pdata)14 {15 while(1)16 {17 XGpioPs_WritePin(&psGpioInstancePtr, 55, 1);//EMIO的第1位输出118 OSTimeDly(200);19 XGpioPs_WritePin(&psGpioInstancePtr, 55, 0);//EMIO的第1位输出020 OSTimeDly(200);21 }22 }两个任务的代码
上面代码中的关键是OSTimeDly();函数,它是uCOS提供的系统函数。该函数“告诉”操作系统:当前任务要延时固定的时钟节拍(Tick)时间,可以在这段时间内将CPU让给其他任务来使用,延迟节拍数到达后本任务再通过“竞争上岗”继续运行。和OSTimeDly();类似的系统函数还有OSTimeDlyHMSM();它们的区别在于OSTimeDly();参数的单位是时钟节拍数(Ticks),而OSTimeDlyHMSM();的单位则是时、分、秒。这里两个任务分别按照200个Ticks和300个Ticks的间隔切换LED的亮灭状态。
接下来查看一下每个Ticks的时长:打开本工程的板级支持包(bsp)工程xxx_bsp下include文件夹下的os_cfg.h,并在其中搜索宏OS_TICKS_PER_SEC,它定义了每秒钟内时钟节拍的数量。缺省情况下,这个宏被配置为1000,即每个Tick的时长为1ms。两个任务中的延迟也就分别是200ms和300ms。个人觉得,这个时间片长度对于运行速度为650MHz的Cortex-A9内核还是有点偏长,实际应用中可以考虑适当增加OS_TICKS_PER_SEC的数量。
4、编写任务配套的初始化代码
和其他所有uCOS开发一样,我们也需要为每个任务完成设置优先级、分配堆栈和创建任务等工作。代码如下所示:(注意:这些代码有问题,关于解决和改正的办法,将在本博文后续部分介绍)
1 //设置任务优先级2 #define LED_TASK_Prio 33 #define LED1_TASK_Prio 54 //设置任务堆栈大小5 #define LED_STK_SIZE 646 #define LED1_STK_SIZE 647 //任务堆栈8 OS_STK TASK_LED1_STK[LED_STK_SIZE];9 OS_STK TASK_LED_STK[LED1_STK_SIZE];
在main函数中补充EMIO初始化的代码:
1 XGpioPs_Config* GpioConfigPtr; 2 int xStatus; 3 //EMIO的初始化 4 GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID); 5 if(GpioConfigPtr == NULL) 6 return XST_FAILURE; 7 xStatus = XGpioPs_CfgInitialize(&psGpioInstancePtr,GpioConfigPtr, GpioConfigPtr->BaseAddr); 8 //EMIO的输入输出设置 9 XGpioPs_SetDirectionPin(&psGpioInstancePtr, 54,1);10 XGpioPs_SetDirectionPin(&psGpioInstancePtr, 55,1);11 //使能EMIO输出12 XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 54,1);13 XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, 55,1);EMIO初始化代码
随后还可看启动操作系统的函数:
1 UCOSStartup(MainTask);
在MainTask任务中添加两个LED任务的启动函数:
1 //初始化任务2 OSTaskCreate(TaskLed, (void * )0, (OS_STK *)&TASK_LED_STK[LED_STK_SIZE-1], LED_TASK_Prio);3 OSTaskCreate(TaskLed1, (void * )0, (OS_STK *)&TASK_LED1_STK[LED1_STK_SIZE-1], LED1_TASK_Prio);
另外在MainTask中保留不断输出任务的代码,起作用是每隔1秒中输出一遍启动时间。
1 int i=0; 2 while (DEF_TRUE) {3 OSTimeDlyHMSM(0, 0, 1, 0);4 printf("%d seconds from main task start.\r\n",i);5 i++;6 };MainTask输出的代码
四、在调试中解决的几个问题
在SDK中编译代码后将FPGA的配置文件和PS的程序下载到Zynq器件中,运行程序后会发下TaskLed1任务无法正常运行,返回代码中查找问题。
1、任务优先级重新分配
由于TaskLed1任务无法正常运行,我首先想到的是任务优先级分配的问题。首先查看工程xxx_bsp下include文件夹下的os_cfg.h中的宏OS_LOWEST_PRIO,发现该宏定义的最低优先级为63。我自己编写代码中定义的优先级LED_TASK_Prio和LED1_TASK_Prio分别为3和5,远远没有达到这个极限,说明问题不在这里。
随后检查模板中定义的唯一一个任务MainTask的优先级,进入模板中启动这个任务的函数UCOSStartup(MainTask);。其中创建该任务的函数中定义的优先级为UCOS_START_TASK_PRIO,其值居然为5!也就是说我随意定义的任务优先级LED1_TASK_Prio居然和模板中使用的唯一一个优先级是重复的——这就是TaskLed1任务无法正常运行的原因。
2、任务堆栈的修改
不幸的是修改TaskLed1任务的优先级数后,发现这两个任务居然都不能正常运行了。重新对照模板中提供的MainTask代码,来检查自己编写的代码,发现这个任务的堆栈深度居然为784,远大于我分配给TaskLed和TaskLed1两个任务的64!
我尝试将TaskLed和TaskLed1两个任务的堆栈分配为1024后,代码如下:
1 //设置任务优先级2 #define LED_TASK_Prio 33 #define LED1_TASK_Prio 44 //设置任务堆栈大小5 #define LED_STK_SIZE 10246 #define LED1_STK_SIZE 10247 //任务堆栈8 OS_STK TASK_LED1_STK[LED_STK_SIZE];9 OS_STK TASK_LED_STK[LED1_STK_SIZE];
修改后的代码就正常了。分析原因,应该是EMIO操作函数XGpioPs_WritePin(&psGpioInstancePtr, 54, 1);占用的内存较多。但幸运的是,Zynq系统使用DDR内存系统往往达到100MB以上甚至数GB,为每个任务分配数KB的堆栈应该问题不大。
关键词:
-
在Zynq平台上使用uCOS [原创www.cnblogs.com/helesheng]-天天热文
介绍了在Zynq-7000的PS部分使用uCOS操作系统的方法与步骤,并提供了一些常见问题的解决思路。
来源: 在Zynq平台上使用uCOS [原创www.cnblogs.com/helesheng]-天天热文
ChatExcel?|焦点信息
全球讯息:【手记】翻新显卡安装驱动程序
信息:2022年跨境电商市场规模15.7万亿元
【新华500】新华500指数(989001)4日收涨0.05% 环球即时
新华社权威快报丨2023年“五一”假期全国营业性客运量合计26971.6万人次
【环球时快讯】6499元买吗?雷军晒小米13 Ultra限量定制色真机上手图:网友大呼背刺
家用强力灭蚊!雅格充电电蚊拍10.9元起狂促_报资讯
世界聚焦:“五一”假期日均125.3万人次出入境
报道:我设计了个【方案】:比redis好10倍的kv库【一统kv】
Apache Pulsar 在火山引擎 EMR 的集成与场景
PA 2022 部分题解_环球热门
ios app真机测试到上架App Store详细教程-必看 快播
奈雪五一小长假订单同比上涨120% 部分门店涨幅超800%|热资讯
【天天热闻】五一18人预付9600元订民宿遭毁约!青岛市监局立案调查
环球视讯!4月百城二手住宅价格跌幅扩大:挂牌量持续走高 房价走势承压
Hadoop运行集群搭建-世界速读
golang基础知识 环球快讯
聚焦:用手机号码归属地 API 开发的应用推荐
环球快资讯丨来了乌鲁木齐,相当于去了中东石油富豪区消费?
全面看齐新7系!宝马新一代5系G60外观、内饰首度公开亮相:发光双肾抢眼-全球速讯
门密码锁怎么加入指纹?第一次使用记住这4点 环球讯息
让Visual Studio用上chatgpt
【解决方法】白嫖利用WPS自带C盘清理大师,清理C盘空间,自测清理19.5G空间,太感人了! 当前快播
Linux安装部署Redis(超级详细)-全球看热讯
博安生物(6955.HK):地舒单抗注射液国际3期临床试验完成首例受试者入组|今日视点
纤薄身材也能满血发挥!耕升RTX 4070踏雪评测:2K游戏通吃的高颜值显卡 环球关注
购燃油车就送粤A蓝牌!广汽集团在广州推限时购车补贴
看不下去AI胡说八道 英伟达出手给大模型安了个“护栏”
世界通讯!鼠目寸光是什么生肖_鼠目寸光的意思及造句
世界微资讯!热门的常用 API 大全分享
观速讯丨Spring AOP官方文档学习笔记(三)之基于xml的Spring AOP
播报:常见未授权访问漏洞汇总
每日播报!AD主辅域控切换-辅域控制器升级为主域控制器-详细操作
Excel文件根据自定义模板生成标签或数据报表
2023山东东营市广饶县事业单位招聘面试通知书领取通知
u18包括18岁吗?足球比赛中的u系列是什么意思?
英雄联盟150位英雄名字是什么?2022lpl夏季赛赛程表
iphone手机看电子书能用什么格式?iphone电子书APP推荐
NBA 2K14存档文件在哪里?nba2k14电脑版键盘操作
十全食美多种零食 奥利奥大礼包39元1.6斤再发车
不涨价!小米13 Ultra限量定制色上架:16+512GB售价6499元
仙气飘飘 洛阳90后女生穿汉服开公交:展示传统文化之美
观察:发布整整10年后:第一代iPad Air被正式抛弃
刺客信条系列中哪个最好玩?刺客信条奥德赛选男还是女?
阿迪达斯官网买的产品是正品吗?阿迪达斯和耐克是什么关系?
承重墙允许开洞最大尺寸是多少?承重墙拆了要承担什么责任?
安陵容知道是宝鹃害她的吗?甄嬛传当年火到什么程度?
广交会里的“大食物观” 食品企业坚持科技创新|全球今日报
只种一颗杨梅树会结果吗?宏宝莱杨梅冰多少钱一袋?
怎么改蚂蚁庄园小鸡的名字?蚂蚁森林如何修改自己的昵称?
天天微速讯:学系统集成项目管理工程师(中项)系列17a_范围管理(上)
使用python查看五黄及罗猴
世界百事通!【访问者设计模式详解】C/Java/JS/Go/Python/TS不同语言实现
THE PLANETS MERCURY -环境变量的设置提权以及SETENV的理解
嵌入式测试手册——基于NXP iMX6ULL开发板(2)
gta4热咖啡补丁下载_GTA4热咖啡
京口法院微电影把诈骗“演”给你看|世界热门
五一假期返程现特种兵式学习:小学生高铁小桌板上疯狂赶作业
1盒不到3元!特仑苏全脂/低脂牛奶大促:高蛋白 易吸收
世界简讯:AMD正式发布锐龙7040U APU:最先进4nm Zen4、15W超低功耗
“非洲狮的好朋狗”?动物园回应圈养鸡羊狗:珍稀品种 非普通家禽|每日观点
320.37万人次,42.32亿元!海南“五一”旅游成绩单出炉 今日热文
观热点:第1章 大数据概述
世界热点评!内网穿透
工控机中部署Ubuntu 22.04 系统
【财经分析】贝泰妮高增长不再 股价跌去六成后能否再出发?
全球热点评!众智科技:4月28日获融资买入89.58万元,占当日流入资金比例19.76%
特斯拉中国突然涨价 销售催“等等党”赶紧下单:早买车就是赚到
路人如何衡量汽车品牌营销费用高低?李想支了一招:看留言-天天速讯
止渴解腻夏日必备!果舒拉桂花酸梅晶好价:3盒券后29.9
男子在西湖捞手机日入约一万!官方回应:不是景区工作人员
热火老将乐福本赛季中期从骑士买断加盟
襄阳市市场监管局开展“你点襄检”专项执法行动_全球头条
【国际大宗商品早报】经济衰退前景打压国际油价大幅下挫4% 美麦涨超5% 当前关注
中国影史第三!今年五一档电影总票房超15亿元
【天天播资讯】40系显卡3大优势!再买30系就冤了
世界热议:喂到嘴边的肥肉!新势力无奈破产:富士康喜提造车工厂一座
阿里云:亏了13年刚赚钱 为啥被逼着五折大促销?
世界热资讯!916万人次假期逛郑州 尽享“文化味”“烟火气”
通过Python进行MySQL表信息统计
互联网鬼城!AI专属社交平台爆火:人类只能看不能说_全球最新
小米13 Ultra白色16GB+1 TB版今日首发:7299元
成交单价突破42万元 比亚迪:腾势D9连续4个月30万元以上新能源MPV第一
中远海发(02866.HK):5月3日南向资金减持98.5万股
芍药坦荡荡
云原生底座之上,这些企业领跑行业的秘密
二、高级语言语法描述
降价9万后雪铁龙C6销量暴涨!总经理:价格战对品牌有伤害
环球今日报丨李想怒怼车评媒体人:不投放你 就是因为你太爱煽风点火
骁龙8+平板只要2399!小米是懂人性弱点的-天天热讯
全网千万人学鼻子转牙签 详细教程在此:你学废了吗? 前沿热点
实时焦点:必胜韩国语园地原声韩剧在线观看_必胜韩国语园地
斩赤红之瞳结局谁活着_斩赤红之瞳结局
快消息!时隔7年季后赛再拿两双 两次重伤打不垮辽宁铁人
动态物体追踪 每日简讯
一季度苹果手机均价6800元 iPhone 14 Pro最畅销|全球即时看
上海漫展惊现“女菩萨”:还真有人顶礼膜拜-全球热头条
ASP.NET Core MVC 从入门到精通之HttpContext
24 操作系统的网络架构