IAR中优化等级对Kinetis FGPIO执行速度的影响

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoxiongli/article/details/49638017

在灯光控制、IO模拟Flex Bus等很多应用中,对GPIO的翻转速度有很高的要求,M0+内核中集成了一个特定的single-cycle I/O port,Kinetis中我们称之为Fast GPIO(FGPIO)。它可以完成对IO口的单周期load和store,主要的区别在于FGPIO的端口可以被内核零等待的访问,于是可以达到Core Clock的速度,而普通GPIO需要内核通过内部的crossbar/AIPS来访问,从而增加了时间上的延迟,使GPIO输出频率被限制。


        在客户应用中发现,Codewarrior和KEIL IDE下只需要在代码中直接操作FGPIO的寄存器即可完成GPIO口48Mhz的翻转速度,然而在IAR默认环境中使用同样的起始代码和时钟配置却未能达到48M的翻转速度,而仅有普通GPIO的速度8M左右。通常我们会从时钟上找原因,http://tiyubisai.com/video_news/news_135616.html 但是究其原因,发现原来IAR的优化等级对FGPIO的速度产生了影响,这点很容易被忽略,所以下面截图详细的做一对比:


         如下图1,在IAR的优化选项“Optimizations Tab” 中,优化等级为“Low”,每一句FGPIO翻转的语句 “FGPIOB_PTOR=0x02 ” 反汇编后的代码如图2中红色方框部分为三句,所以这也就大致解释了GPIO输出频率只有8M左右(相当于翻转速度16M,此处忽略程序while(1)的影响)。当更改IAR中“Optimizations Tab” 优化选项如下图3为High(Speed优先)时,每一句FGPIO翻转的语句 “FGPIOB_PTOR=0x02 ” 反汇编后的代码如图4中红色方框部分为一句,于是得到的GPIO输出频率为24M左右(相当于翻转速度48M,同样此处忽略程序while(1)的影响),刚好是未设置高优化等级之前的三倍,最终在硬件设备上完成了对GPIO的单周期访问和更改。


        总之,FGPIO的实际输出速度出来和程序代码有关系之外,还和优化等级的设置有关系,需要用户在实际应用中多加注意。有兴趣的读者可以拿未优化之前的代码和普通GPIO操作的代码做一对比,查看反汇编代码长度、反汇编代码访问的GPIO寄存器地址以及GPIO执行速度之间的关系,可以发现即便反汇编出来的代码长度一样,由于访问的寄存器地址不同也会导致GPIO输出频率的不同和差异。


图1 . IAR中优化等级的默认设置 


图2 . 在IAR默认的优化等级条件下,FGPIO翻转语句反汇编代码


图3. 更改IAR中默认优化等级设置


图4. 更改IAR中默认优化等级设置后,FGPIO翻转语句反汇编后代码

http://blog.csdn.net/xiaoxiongli/article/details/49637973

http://blog.csdn.net/xiaoxiongli/

展开阅读全文

foreach几百次的执行影响速度..

11-06

string emailinfoidArray = eifBLL.LoadEmailHistoriesAccordingUserOrProduct(parmEmailInfoID, CustomerID, Sku);rn LoadEmailHistoriesAccordingUserOrProduct是BLL中的一个方法rn string[] splitemailinfoid = substr.Split(new char[] '|' );rn foreach (string str in splitemailinfoid)rn rnrn 假设emailinfoidArray="102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|102|"..用split分割..然后用foreach这样要执行几百次.非常的影响运行速度..请问还有别的方法能加快速度吗?我想不出来了.... 论坛

优化foreach遍历执行速度

08-03

[code=csharp]foreach (var line in path)rn rnrn if (line.IndexOf("https") != -1)rn rn string a = line.Substring(8, line.Replace("://", "").IndexOf("/") - 5);//截取获取网站域名rn doma = a;rn rn else if (line.IndexOf("http") != -1)rn rn string a = line.Substring(7, line.Replace("://", "").IndexOf("/") - 4);//截取获取网站域名rn doma = a;rn rn else if (line.IndexOf("http") == -1 && line.IndexOf("https") == -1 && line.IndexOf("com") != -1)rn rn string a = line.Substring(0, line.IndexOf("com") + 3);//截取获取网站域名rn doma = a;rn rn elsern rn string a = line.Substring(0, line.IndexOf("cn") + 2);//截取获取网站域名rn doma = a;rn rn if (line.IndexOf(".") == -1)rn rn doma = line;rn rn tryrn rn //Ping 实例对象;rn Ping pingSender = new Ping();rn //ping选项;rn PingOptions options = new PingOptions();rn options.DontFragment = true;rn string data = "ping test data";rn byte[] buf = Encoding.ASCII.GetBytes(data);rn //调用同步send方法发送数据,结果存入reply对象;rn PingReply reply = pingSender.Send(doma, 120, buf, options);rn DateTime.Now.ToString();rnrn if (reply.Status == IPStatus.Success)rn rn String title = GetWebClient(line);//获取网站的titlern //XML格式保存文本rnrn String www = "\r\n " + doma + "\r\n " + DateTime.Now.ToString() + "\r\n" + CheckUrlVisit(line) + " " + title + "\r\n" + reply.Address + "\r\n" + reply.RoundtripTime + "\r\n" + reply.Options.Ttl + "\r\n" + reply.Buffer.Length + "\r\n " + reply.Options.DontFragment + "\r\n\r\n ";rn p += www;rnrn rn elsern rn p += "\r\n" + doma + "\r\n" + DateTime.Now.ToString() + "\r\n" + CheckUrlVisit(line) + "\r\n 获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n\r\n"; ;rn rn rn catchrn rn p += "\r\n" + doma + "\r\n" + DateTime.Now.ToString() + "\r\n" + CheckUrlVisit(line) + "\r\n 获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n获取失败!!!\r\n\r\n"; ;rn rn [/code] 论坛

没有更多推荐了,返回首页