tag 标签: 代码优化

相关博文
  • 热度 4
    2024-1-18 15:56
    577 次阅读|
    0 个评论
    思瑞浦与IAR携手共筑嵌入式开发生态
    IAR Embedded Workbench for Arm 全面支持 3PEAK TPS32 混合信号微控制器主流系列产品 中国,上海 – 2024 年 1 月 18 日 – 嵌入式开发软件和服务的全球领导者 IAR 与思瑞浦今日联合宣布, IAR 旗舰产品 IAR Embedded Workbench for Arm 已全面支持思瑞浦 TPS32 混合信号微控制器主流系列产品,将为开发者提供更完整、高效的开发解决方案。 思瑞浦总部位于中国,提供模拟及嵌入式处理器产品和解决方案,销售和技术支持服务网点遍布美国、欧洲、日本、韩国以及中国台湾地区。在信号链和电源领域深耕与积累多年后,思瑞浦进军嵌入式处理器领域,并已取得亮眼的成绩。经过两年的潜心研发,精选工艺,严控质量,思瑞浦成功打造了首款数模混合信号 MCU 平台。 TPS32 是思瑞浦自主研发的混合信号微控制器芯片系列产品的旗舰品牌。凭借对垂直应用的深入洞察和对客户需求的持续挖掘,目前已经推出应用于泛工业领域的 TPS325M0 和 TPS325M5 两个系列产品,并迅速获得了行业龙头客户的广泛采用和好评。 IAR Embedded Workbench 集成开发环境一直是全球众多开发者在嵌入式软件开发中的优选解决方案。这一强大的工具套件已经为数百万开发者提供了全面且高效的支持。通过该解决方案,开发者能够充分利用代码优化功能,并享有一系列强大的调试功能,包括代码和数据断点、运行时堆栈分析以及调用堆栈可视化等。此外, IAR Embedded Workbench 还集成了静态代码分析工具 C-STAT 和动态代码分析工具 C-RUN ,可帮助开发者及早发现潜在问题,提高代码质量。值得一提的是, IAR 还提供经过 TÜV SÜD 认证的功能安全版本,符合 ISO 26262 等功能安全认证标准,为开发功能安全产品的开发者提供了有力的支持。 思瑞浦 MCU 事业部高级总监陈丽华女士表示: “ 在提 供优质的芯片产品的同时,思瑞浦还致力于为用户提供易使用、高品质、全方位、开放式的软硬件开发生态系统。我们非常荣幸能与业内知名的工具链供应商 IAR 建立合作伙伴关系,我们的合作启于未发,循序而进。 IAR 对于 3PEAK 芯片的全面支持,以及思瑞浦基于 IAR Embedded Workbench for Arm 提供完整 TPS32 SDK 软件包,这些仅仅是我们合作的第一步。坚信在不久的将来,我们将与 IAR 在更多的领域展开合作 , 共筑嵌入式开发生态,为客户创造真正的价值,提供便捷的体验。 ” IAR 亚太区副总裁 Kiyo Uemura 表示: “ 我们很高兴与思瑞浦达成合作,并对未来充满期待且信心十足。长期以来,我们深刻认识到中国在全球市场中的关键地位,蕴藏着巨大的潜力和无限机遇。思瑞浦作为国内强影响力的半导体上市公司,技术实力深厚,不断突破创新。我们与思瑞浦的合作彰显了双方的相互信任,两家公司将利用各自领域的技术优势,共同打造充满活力的嵌入式领域生态系统,为开发者提供世界一流的开发工具和原厂技术支持。 ” 有关 IAR Embedded Workbench for Arm 的更多详细信息,以及支持的超过 8800 款 Arm 芯片,请访问 https://www.iar.com/cn/product/architectures/arm/iar-embedded-workbench-for-arm/ 。
  • 热度 14
    2016-3-7 15:27
    867 次阅读|
    0 个评论
    ==== 函数原型 ====   code 代码原型,不是我写的。只是拿来copy。 static LA_bool xxx(unsigned char *src, int Width, int Height, short *table1, short *table2,     int dstWidth, int dstHeight, int nchanner, unsigned char *dst, Rect_S stRect) {     int sx, sy;     int i, j;     int stepSrc = Width * nchanner;     int stepDstMapxy = dstWidth;     int stepDstMapCoef = dstWidth * 2;     short cof00, cof01, cof10, cof11;     int offset1, offset2;     //int r, g, b;     int dstoff = 0;     int coflinestart;     int dstlinestart;     int *xy_tab = (int *)table1;     int *cof_tab = (int *)table2;     int xyval = 0;     int xyoff, coff;     int cofval1, cofval2;     unsigned char r00, g00, b00, r01, g01, b01, r10, g10, b10, r11, g11, b11;     char *p1, *p2;     int rgb0, rgb1, rgb2, rgb3;     unsigned char *pDtmp;       for (j = stRect.top; j stRect.bottom; ++j)     {         coflinestart = j*stepDstMapCoef;         dstlinestart = j*dstWidth * 3;         pDtmp = dst + dstlinestart + stRect.left * 3;         for (i = stRect.left; i stRect.right; ++i)         {             xyoff = j*stepDstMapxy + i;             xyval = *(xy_tab + xyoff);             sy = (xyval 16) 0x0000ffff;             sx = xyval 0x0000ffff;               coff = coflinestart + (i 1);               cofval1 = *(cof_tab + coff);             cofval2 = *(cof_tab + 1 + coff);             cof01 = (cofval1 16) 0x0000ffff;             cof00 = cofval1 0x0000ffff;             cof11 = (cofval2 16) 0x0000ffff;             cof10 = cofval2 0x0000ffff;               offset1 = (sy * stepSrc + sx*nchanner);             offset2 = offset1 + stepSrc;               p1 = (char *)(src + offset1);             p2 = (char *)(src + offset2);               r00 = *p1++;             g00 = *p1++;             b00 = *p1++;             r01 = *p1++;             g01 = *p1++;             b01 = *p1++;               r10 = *p2++;             g10 = *p2++;             b10 = *p2++;             r11 = *p2++;             g11 = *p2++;             b11 = *p2++;               *(pDtmp++) = (unsigned char)((r00 * cof00 + r10 * cof01 + r01 * cof10 + r11 * cof11) BITOFF);             *(pDtmp++) = (unsigned char)((g00 * cof00 + g10 * cof01 + g01 * cof10 + g11 * cof11) BITOFF);             *(pDtmp++) = (unsigned char)((b00 * cof00 + b10 * cof01 + b01 * cof10 + b11 * cof11) BITOFF);         }     }     return 1; } /code   ==== 优化后代码 ====   code static int ImgIn_w = 800; static int ImgIn_h = 600; static int Img_w = 600; static int Img_h = 800; static int PixelSize = 2; static void Load_Dot16_YUV422(int stRect_left, int stRect_right, int stRect_top, int stRect_bottom, int ImageIndex, int ImageOutIndex) {     unsigned int src0 = pImgS1In;     unsigned int dst0 = pImgS1Out;     unsigned int xy_tab0 = pParam_Loadx4XY;     unsigned int  cof_tab0 = pParam_Dot16Cof;       int Index_i, Index_j;     unsigned char* src;     unsigned char * src1;     register tu32 XY_tab_Addr;     unsigned long long *pXY_tab;       int i_LoopNum;     int j_offset;       unsigned long long offset_12;     int offset_load_1;     int offset_load_1_is;     unsigned long long data_load_A_1;     unsigned long long data_load_B_1;       int offset_load_2;     int offset_load_2_is;     unsigned long long data_load_A_2;     unsigned long long data_load_B_2;       unsigned long long *pCof_tab;     unsigned long long *pCof_tab1;     unsigned long long Cof_ABCD_1;     unsigned long long Cof_ABCD_2;       unsigned long long Data64_AND_00FF = 0x00FF00FF00FF00FF;       unsigned int Data32_7654_A_1;     unsigned int Data32_7654_B_1;     unsigned int Data32_3210_A_2;     unsigned int Data32_3210_B_2;       unsigned long long Data64_DP2_76765454_1;     unsigned long long Data64_DP2_32321010_2;       unsigned long long Data64_DPH4_75753131_1;     unsigned long long Data64_DPH4_75753131_2;       unsigned long long Data64_MV55_75753131_1;     unsigned long long Data64_MV33_75753131_2;       unsigned long long Data64_SHFU_75753131_1;     unsigned long long Data64_SHFU_75753131_2;       unsigned int Data32_7575_1;     unsigned int Data32_3131_1;     unsigned int Data32_7575_2;     unsigned int Data32_3131_2;     int Shift_Num_1;     int Shift_Num_2;       //AB     //CD     unsigned long long Data64_Y0_0B0D0A0C;     unsigned long long Data64_Y1_0B0D0A0C;     unsigned long long Data64_U0_0B0D0A0C;     unsigned long long Data64_V1_0B0D0A0C;       __x128_t D128_Y1Y0_0B0D0A0C;     __x128_t D128_V1U0_0B0D0A0C;     __x128_t D128_C1C0_0B0D0A0C;     unsigned long long D64_Y1Y0_Dot16;     unsigned long long D64_V1U0_Dot16;     unsigned long long D64_Y1Y0_SHRU;     unsigned long long D64_V1U0_SHRU;     unsigned long long D64_V1_Y1_U0_Y0;     unsigned int D32_V1_Y1;     unsigned int D32_U0_Y0;     unsigned int D32_V1Y1U0Y0;       src = src0;     src1 = src0 + ImgIn_w * PixelSize;       //图层偏址     xy_tab0+=Img_h*Img_w*4*ImageIndex;     cof_tab0+=Img_h*Img_w*(13)*ImageIndex;     dst0 +=Img_h*Img_w*2*ImageOutIndex;       //windows偏址     {         j_offset = stRect_top*Img_w;         xy_tab0 = xy_tab0 + (j_offset2);         cof_tab0= cof_tab0 + (j_offset3);         dst0 = dst0 + (j_offset1);     }     //line偏址     {         j_offset = stRect_left;         xy_tab0 = xy_tab0 + (j_offset2);         cof_tab0= cof_tab0 + (j_offset3);         dst0 = dst0 + (j_offset1);     }       //行循环     i_LoopNum = stRect_right-stRect_left;     i_LoopNum = i_LoopNum1;       for (Index_j = stRect_top; Index_j stRect_bottom; Index_j++)     {         //pre_init         XY_tab_Addr = xy_tab0;         pXY_tab = XY_tab_Addr;         xy_tab0+=(Img_w2);         pCof_tab = cof_tab0;         cof_tab0+=(Img_w3);         pDtmp = dst0;         dst0+=(Img_w1);           //pre_Loop         {             pCof_tab1 = pCof_tab ;               offset_12 = *pXY_tab++;//C1             offset_load_1 = _loll(offset_12);//C1             offset_load_2 = _hill(offset_12);//C1             data_load_A_1 =  _mem8(src+offset_load_1);//C1             data_load_B_1 =  _mem8(src1+offset_load_1);//C1             data_load_A_2 =  _mem8(src+offset_load_2);//C1             data_load_B_2 =  _mem8(src1+offset_load_2);//C1             offset_load_1_is = offset_load_12;//C1             offset_load_2_is = offset_load_22;//C1             offset_12 = *pXY_tab++;//C2         }           for (Index_i =0; Index_i i_LoopNum+1; Index_i++)         {             Data32_7654_A_1 = _hill(data_load_A_1);             Data32_7654_B_1 = _hill(data_load_B_1);             Data64_DP2_76765454_1 = _dpack2(Data32_7654_B_1, Data32_7654_A_1);             Data32_3210_A_2 = _loll(data_load_A_2);             Data32_3210_B_2 = _loll(data_load_B_2);             Data64_DP2_32321010_2 = _dpack2(Data32_3210_B_2, Data32_3210_A_2);               Data64_DPH4_75753131_1 = _dpackh4(data_load_B_1, data_load_A_1);    //76543210 765432107575 3131             Data64_DPH4_75753131_2 = _dpackh4(data_load_B_2, data_load_A_2);    //76543210 765432107575 3131               Data32_7575_1 = _hill(Data64_DPH4_75753131_1);             Data32_3131_1 = _loll(Data64_DPH4_75753131_1);             Shift_Num_1 = 8;             if(offset_load_1_is==0)             {                 Data32_3131_1 = Data32_7575_1;                 Shift_Num_1 = 0;             }             Data64_MV55_75753131_1 = _itoll(Data32_7575_1, Data32_3131_1);             Data64_SHFU_75753131_1 = _dshru(Data64_MV55_75753131_1, Shift_Num_1);               Data32_7575_2 = _hill(Data64_DPH4_75753131_2);             Data32_3131_2 = _loll(Data64_DPH4_75753131_2);             Shift_Num_2 = 0;             if(offset_load_2_is==0)             {                 Data32_7575_2 = Data32_3131_2;                 Shift_Num_2 = 8;             }             Data64_MV33_75753131_2 = _itoll(Data32_7575_2, Data32_3131_2);             Data64_SHFU_75753131_2 = _dshru(Data64_MV33_75753131_2, Shift_Num_2);               Data64_Y0_0B0D0A0C = Data64_DP2_76765454_1 Data64_AND_00FF;             Data64_Y1_0B0D0A0C = Data64_DP2_32321010_2 Data64_AND_00FF;             Data64_U0_0B0D0A0C = Data64_SHFU_75753131_1 Data64_AND_00FF;             Data64_V1_0B0D0A0C = Data64_SHFU_75753131_2 Data64_AND_00FF;           //这里是循环优化begin         offset_load_1 = _loll(offset_12);//C2         offset_load_2 = _hill(offset_12);//C2         data_load_A_1 =  _mem8(src+offset_load_1);//C2         data_load_B_1 =  _mem8(src1+offset_load_1);//C2         data_load_A_2 =  _mem8(src+offset_load_2);//C2         data_load_B_2 =  _mem8(src1+offset_load_2);//C2         offset_load_1_is = offset_load_12;//C2         offset_load_2_is = offset_load_22;//C2         offset_12 = *pXY_tab++;//C3         //这里是循环优化end //-----------------               Cof_ABCD_1 = *pCof_tab;pCof_tab+=2;             Cof_ABCD_2 = *pCof_tab1;pCof_tab1+=2;               D128_C1C0_0B0D0A0C = _llto128(Cof_ABCD_2, Cof_ABCD_1);             D128_Y1Y0_0B0D0A0C = _llto128(Data64_Y1_0B0D0A0C, Data64_Y0_0B0D0A0C);             D128_V1U0_0B0D0A0C = _llto128(Data64_V1_0B0D0A0C, Data64_U0_0B0D0A0C);                   D64_Y1Y0_SHRU = _dshr(D64_Y1Y0_Dot16, BITOFF);//dot延迟,流水线输出超越处理                 D64_V1U0_SHRU = _dshr(D64_V1U0_Dot16, BITOFF);               D64_Y1Y0_Dot16 = _ddotpsu4h(D128_Y1Y0_0B0D0A0C, D128_C1C0_0B0D0A0C);             D64_V1U0_Dot16 = _ddotpsu4h(D128_V1U0_0B0D0A0C, D128_C1C0_0B0D0A0C);                   D64_V1_Y1_U0_Y0 = _dpackl4(D64_V1U0_SHRU, D64_Y1Y0_SHRU);                 D32_V1_Y1 = _hill(D64_V1_Y1_U0_Y0);                 D32_U0_Y0 = _loll(D64_V1_Y1_U0_Y0);                 D32_V1Y1U0Y0 = _packl4(D32_V1_Y1, D32_U0_Y0);                 if(Index_i)                 {                     *pDtmp++ = D32_V1Y1U0Y0;                 }   //-----------------           }     }     return ; } /code  
  • 热度 15
    2015-3-24 13:49
    1206 次阅读|
    0 个评论
       EDN博客精华文章   作者: ilove314 Verilog代码优化之for语句   这回来谈谈for语句,硬件里的for语句不像软件那样频繁的使用。一方面是因为for语句的使用是很占用硬件资源的,另一方面是因为在设计中往往是采用时序逻辑设计用到for循环的地方不多。   下面是一个用到for循环设计的代码:   这段代码的用意是在一个时钟周期内计算出13路脉冲信号为高电平的个数,一般人都会感觉这个任务交给for循环来做再合适不过了,但是for循环能完成这个任务吗?   我们来看看仿真的结果: 点击看原图   相信你已经发现问题了,为什么每个时钟周期for循环只执行一次num = num+1呢?笔者也很困惑,或许综合工具遇到for也无能为力了吧!所以,慎用for语句!
相关资源
  • 所需E币: 4
    时间: 2019-12-25 23:17
    大小: 7.1KB
    上传者: 二不过三
    本文档是TMS320VC55代码优化(函数优化改写总结),适合读者参考与学习。……
  • 所需E币: 4
    时间: 2019-12-25 23:17
    大小: 7.1KB
    上传者: wsu_w_hotmail.com
    本文档是TMS320VC55代码优化(函数优化改写总结),适合读者参考与学习。……
  • 所需E币: 3
    时间: 2019-12-25 23:17
    大小: 7.1KB
    上传者: 978461154_qq
    本文档是TMS320VC55代码优化(函数优化改写总结),适合读者参考与学习。……
  • 所需E币: 3
    时间: 2019-12-25 16:52
    大小: 1.6MB
    上传者: givh79_163.com
    即使你已经知道如问编写嵌入式软件,你还是可以从这本书里学到很多东西。除了了解如何更有效地使用C和C++你还将会从本书中对常见的嵌人式软件问题的详细解释,并从本书所提供的源代码中得到益处。本书中包含的高级主题有存储器检测和验证、设备驱动程序的设计和实现.实时操作系统的内部机理,还有代码优化技术。C/C++嵌入式系统编程MicbaelBarr著于志宏译作者简介MichaelBarr是Netrino公司(一个嵌入式系统共享软件和软件工程服务提供商)的创始人兼总裁。Netrino公司鼓励所有职员通过为杂志撰稿和在业界会议演讲来分享自己的专业知识。这些资料可以在公司的网站http://www.netrino.com找到。Michael拥有马里兰大学的电机工程学士和硕士学位。他的大部分时间都用在嵌入式软件、设备驱动和实时操作系统的开发上了。他还喜欢写作、教书,并期待着开始下一部著作的创作。目前他有好几个计划,其中包括一部小说。前言首先需要弄清楚,你为什么希望你的学生学习某个主题,以及你希望他们学到什么,那么一般来说,你授课的方法或多或少就有了。-RichardFeynman今天,几乎所有电子设备里面部包含了嵌人式的软件系统。这些软件隐藏在我们的手表里、录像机里、蜂窝电话里,甚至可能在烤面包机里面。军事上会使用嵌入式软件来引导导弹。侦测敌方的飞行物。外太空探测器和许多医疗仪器离开嵌人式软件几乎不可能工作。设计人员不得不写所有的代码,实际上,成千上万的电子工程师计算机科学家和其他专业人……
  • 所需E币: 5
    时间: 2019-12-25 12:44
    大小: 1.34MB
    上传者: 238112554_qq
    利用RealView_Profiler找寻代码优化良机.TECHNOLOGYIN-DEPTH利用RealViewProfiler工具进行软件代码优化简介中包含各个函数所耗时间(包括有关函作者电子产品市场的竞争呈日益加剧之数间关系的统计数据)以及内存存取次ElanTanzer势,这就意味着,加快产品投放市场的数、延迟次数和代码覆盖等。ARM步伐、提升系统的复杂性已经成为制胜的关键因素。在加快产品面市的同时更优化方法为迅速地增加产品功能、提高产品质量RealView系列工具提供了两种主要正是众多公司目前面临的挑战。因此,的应用程序优化方法。最快的方法就是能够精准探识系统性能的工具就成了必通过编译器指令进行优化。比如,在最不可少的要素。基础的层次,可通过一个特定目标实现……
  • 所需E币: 4
    时间: 2019-12-25 11:36
    大小: 309.39KB
    上传者: wsu_w_hotmail.com
    流水线技术是广泛应用在微处理器体系结构中的关键技术。本用的三级和五级流水线的工作原理,对各种冲突情况下的流水线最后通过实例分析提出在编程阶段提高流水线性能的方法。……
  • 所需E币: 4
    时间: 2019-12-25 03:29
    大小: 178KB
    上传者: givh79_163.com
    C代码优化方案C代码优化方案C代码优化方案11、选择合适的算法和数据结构32、使用尽量小的数据类型33、减少运算的强度3(1)、查表(游戏程序员必修课)3(2)、求余运算4(3)、平方运算4(4)、用移位实现乘除法运算4(5)、避免不必要的整数除法5(6)、使用增量和减量操作符5(7)、使用复合赋值表达式6(8)、提取公共的子表达式64、结构体成员的布局7(1)按数据类型的长度排序7(2)把结构体填充成最长类型长度的整倍数7(3)按数据类型的长度排序本地变量7(4)把频繁使用的指针型参数拷贝到本地变量85、循环优化9(1)、充分分解小的循环9(2)、提取公共部分9(3)、延时函数9(4)、while循环和do…while循环10(6)、循环展开10(6)、循环嵌套11(7)、Switch语句中根据发生频率来进行case排序12(8)、将大的switch语句转为嵌套switch语句13(9)、循环转置14(10)、公用代码块15(11)提升循环的性能15(12)、选择好的无限循环156、提高CPU的并行性16(1)使用并行代码16(2)避免没有必要的读写依赖177、循环不……
  • 所需E币: 3
    时间: 2020-1-4 23:35
    大小: 99.61KB
    上传者: rdg1993
    RTL代码优化的文章……