免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6476 | 回复: 18
打印 上一主题 下一主题

Linux 移植1 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-09 16:58 |只看该作者 |倒序浏览
通过和当时svn库diff后的统计结果
*******************************************************************************************************************************
代码修改统计:
1、删除了很多空格,主要是大括号或每行结束后,原来遗留的类似Tab空格删除了。
   eg:platform\rosarb\module\adarb\src\rs485\  rs485_smsapi_common.c:3457-3458行
      platform\rosarb\module\adarb\src\rs485\  rs485_smsapi_stub.c:4570-4572行(这里可能把每行前面的Tab改为空格)
      ...

2、VOID 改为 VOS_VOID、UINT32 改为 VOS_UINT32、BOOL 改为 VOS_BOOL、VOS_FALSE 改为 0、USHORT 改为unsigned short、ULONG 改为unsigned long
   eg:platform\rosarb\module\adarb\src\rs485\  rs485_smsapi_common.h:419-420行
      platform\rosarb\module\clkrb\src\tasm    ctasm_clkneg.c:42行

论坛徽章:
0
2 [报告]
发表于 2011-11-09 16:58 |只看该作者
3、直接添加的打桩函数
   eg:platform\rosarb\module\adarb\src\rs485\  rs485_smsapi_stub.c:6234-6522行
             platform\rosarb\module\idcs\src\csm                csmdhcp_client.c:36-38行
   
4、注销一些可能导致问题的代码段

   (1)暂时取消注册秒定时器,因为会引起消息过载
      a) platform\rosarb\module\bin\src\ebin\  bin_init.c: 113-122行
      b) platform\rosarb\module\bin\src\emoa\  moa_init.c: 85-92行
      c) \platform\rosarb\module\mml\src\emml\common  mml_msg.c: 236-245
      d) platform\rosarb\module\trc\src\ltrc        trc_ioinit.c: 1530-1544
      
   (2)去掉include <vxworks.h>
      a) platform\rosarb\module\cpricbb\src           lcpricbb.c: 20行
      b) \platform\rosarb\module\hdlc\src            hdlc_common.c:        #if (VOS_VXWORKS == VOS_OS_VER)
                                                                                                                                #pragma pack(4)
                                                                                                                                #include <vxWorks.h>
                                                                                                                                #pragma pack()
                                                                                                                                #include

论坛徽章:
0
3 [报告]
发表于 2011-11-09 16:59 |只看该作者
"fioLib.h"
                                                                                                                                #endif
      
   (3)去掉异常模块代码段
      a) platform\rosarb\module\expt\src    xexpt_assert.c: 281-288  获取调用栈
      b)                                    xexpt_collect.c: 许多记录黑匣子的函数被注释掉了。
      c)                                                                        xexpt_init.c:针对VX系统一些调用被注释掉了
      d)                                                                        xexpt_monitor.c
      e)                                                                        xexpt_parse.c
      f)                                                                        xexpt_test.c  
      
   (4)简化逻辑:
      a)\platform\rosarb\module\ha\src\lha  lha.c:
      ulStatus = g_stLhaStatusInfo.ulLocalHaStatus;  改为:        #if (VOS_OS_VER == VOS_LINUX)  //SMP_LINUX_TMP
                                                                                                                            ulStatus = ROSA_HA_STATE_MASTER;
                                                                                                                        #else
                                                                                                                            ulStatus = g_stLhaStatusInfo.ulLocalHaStatus;
                                                                                                                        #endif   
          b)\platform\rosarb\module\idcs\config         v_configidcs.inc: VOS_UINT32 g_ulIdcsHeartbeatReboot = VOS_YES; 改为:VOS_NO
          c)\platform\rosarb\module\lcnrb\adpt\src        lic_adpt.c: 6365-6367行
          d)platform\rosarb\module\swmrb\src\cswmrb                swm_cvmact.c:1637-1640行:关闭软件管理模块的版本校验
          e)platform\rosarb\module\trrb\src\ltlm        ltlm_ethport.c: 1151-1165
       
        (5)VISP不支持TCP_KEEPIDLE,TCP_KEEPINTVL,TCP_KEEPCNT这3个选项的设置。
           platform\rosarb\module\ncm\src\encm                tel_main.c:337-362行:都被注释掉了。
          
        (6)将#elif改为#else:platform\rosarb\module\trrb\src\ltsc        ltsc_ippm.c:2963、3014、3041
       
   
5、大小写敏感问题(涉及最多的是cfg模块,所以要习惯风格统一或者准确引用)
   (1)文件名大小写(把很多大写都改为了小写,否则找不到对应的文件。Linux对大小写敏感)
     eg: platform\rosarb\module\cfg\include  cfg_define.h: 516-520行:TRANSID.DAT 改为:transid.dat

论坛徽章:
0
4 [报告]
发表于 2011-11-09 17:00 |只看该作者
6、路径符号问题:主要是"\\"统一改为"/"(涉及最多的是cfg模块)
   eg:platform\rosarb\module\cfg\src\ccfg\cdm  cdm_bakcfg.c: 13-19行
             ...
      \platform\rosarb\module\ha\config        v_configha.inc: "Tffs:/HA/" 改为 "/Tffs:/HA/"
      ...
   
   
7、对于某些只针对win32的代码,增加了Linux的判断
   a) \platform\rosarb\module\clkrb\src\scuproxy  SUR_Win32Def.h: 27行(if(VOS_OS_VER == WIN32)改为if(VOS_OS_VER == WIN32) || (VOS_LINUX == VOS_OS_VER))
   b) \platform\rosarb\module\expt\src\           xexpt_stub.c: 106行(#if (VOS_OS_VER != VOS_VXWORKS) 改为 #if (VOS_OS_VER != VOS_VXWORKS) && (VOS_OS_VER != VOS_LINUX))
   ...
   
8、增加头文件引用(增加桩模块的引用)
   a)platform\rosarb\module\clkrb\src\synceth  lsynceth.c: 21-23行
   b)platform\rosarb\module\clkrb\src\synceth  lsynceth_drv.c: 21-23行
   ...
   
9、根据Linux的底层,修改个别函数调用。
   a) mkdir调用(参数不同):platform\rosarb\module\devrb\adpt  ctoppxy.h:65-69行
   
10、添加一段代码(不知道意图,可能是为了支持业务需求)
   a) platform\rosarb\module\devrb\src\cdevrb   cdev.c: 1649-1656行:
            vos_printf("\n\r Recv MSG: DEV_INTF_ID_REG from GPP= %x, result=%d",ulGpp,stRegInfo.ulResult);
            CDEV_SetPowerStatus(0x1ff,1);//SMP_LINUX_TMP
            CDEV_SetPowerStatus(0x3ff,1);//SMP_LINUX_TMP
            CDEV_SetPowerStatus(0x5ff,1);//SMP_LINUX_TMP
            CDEV_SetPowerStatus(0x7ff,1);//SMP_LINUX_TMP
            CDEV_SetPowerStatus(0x9ff,1);//SMP_LINUX_TMP
            CDEV_SetPowerStatus(0xbff,1);//SMP_LINUX_TMP
            CDEV_SetPowerStatus(0x1e01ff,1);//SMP_LINUX_TMP
           
   b)platform\rosarb\module\swmrb\src\lswmrb        swm_lloadcpu.c: 27-32行
             #ifndef ERROR //SMP_LINUX_TMP
                #define ERROR   (-1)

论坛徽章:
0
5 [报告]
发表于 2011-11-09 17:00 |只看该作者
#else
                #undef ERROR
                #define ERROR (-1)
                #endif
                           
11、typedef 修改成 宏定义#define
    eg:\platform\rosarb\module\ha\src\common   ha_stub.h:31-46行
            /*  SMP_LINUX_TMP
                typedef unsigned char           U8;
                typedef unsigned short          U16;
                typedef unsigned long           U32;
                typedef signed char             S8;
                typedef short                   S16;
                typedef long                    S32;
                */
               
                #define U8         unsigned char
                #define U16        unsigned short
                #define U32        unsigned long
                #define S8         signed char
                #define S16        short
                #define S32        long
                #define VOID       void
               
12、对于typedef定义的结构体,去掉对struct的引用
    eg:platform\rosarb\module\mtn\src\gftm                ftm_cfmupload.c:1251行                "struct fd_set  ds;" 改为 "fd_set  ds;"
   
13、宏定义直接用数字代替,因为可能与Linux中一些定义冲突
    eg:platform\rosarb\module\ncm\src\encm                tel_main.c:310、311、326、327行:        SOL_SOCKET、SO_REUSEADDR、SO_KEEPALIVE都用数值代替。


***********************************************************************************************************************************
脚本修改统计:
1、makefile.模块名 脚本中的del语句换为rm命令
   eg:每个“makefile.模块名”都需要修改
   
2、脚本路径大小敏感,也要正确
   eg:\platform\rosarb\module\fcm\src   makefile.fcm:4行
   
3、外面的sh文件需要根据现有的脚本进行大量修改,以适合Linux下的编译

论坛徽章:
0
6 [报告]
发表于 2011-11-09 17:02 |只看该作者
********************************************
可疑:
1、platform\rosarb\module\rre\config        v_configrre.c:264-270行:LINUX下缺少"\"字符?
                    #if (VOS_OS_VER == VOS_LINUX) //SMP_LINUX_TMP
            pcTemp = VOS_StrStr(g_astRreFileDirInfo[i].szFilePath, "Tffs:");
            pcTemp1 = VOS_StrStr(g_astRreFileDirInfo[i].szFilePath, "HFFS0:");
            #else
            pcTemp = VOS_StrStr(g_astRreFileDirInfo[i].szFilePath, "Tffs:");
            pcTemp1 = VOS_StrStr(g_astRreFileDirInfo[i].szFilePath, "HFFS0:");
            #endif




1 copy已移植的工程到windows的某个目录下(我是:E:\LinuxProject\RB27C01TR5_LINUX)

2 共享工程目录(RB27C01TR5_LINUX)

3 在Linux下挂载该共享目录(具体见:E:\LinuxProject\tool\mount-project.sh),共享时会提示输入共享密码。(另外:解mount用命令:umount RB27C01TR5_LINUX)
挂载脚本:
#!/bin/bash

mount_source=//10.166.134.111/RB27C01TR5_LINUX
mount_user=china/lwx50124
#mount directory, do not modify
myname=root
mount_point=/liangchong/RB27C01TR5_LINUX

if [ ! -d $mount_point ] ; then
        echo "create directory $mount_point"
        mkdir -p $mount_point
fi

sudo mount -t cifs \
        -o user=$mount_user \
        -o uid=$myname \
        -o gid=users \
        -o defaults \
        $mount_source \

论坛徽章:
0
7 [报告]
发表于 2011-11-09 17:03 |只看该作者
$mount_point

if [ $? = 0 ] ; then
        echo "success mount to $mount_point "
        exit 0
else
        echo "mount $mount_source fail."
        exit 1
fi
?
4 设置编译环境,下载toolchain-be8-20110922.tgz,解压到linux的某个路径下。(我是:/opt/arm/)

5 设置环境变量:第4步解压出来toolchain-be8文件夹,设置环境变量为:export PATH="$PATH:/opt/arm/toolchain-be8/bin"
  这样编译器不再是针对x86的gcc了,而是默认针对G板H1380的gcc了。
  
6 针对Linux下挂载的目录,修改编译脚本各.sh文件对应的WORK_BASE(有的.sh文件不叫WORK_BASE)

  到此,可以按照工程的readme.txt中介绍,顺序执行各步骤的编译操作。
  
  
  
采用windows挂载到linux下的好处:
1、保证windows和Linux同源。因为大家习惯在windows下的sourceInsight进行编辑和查看,而编译又必须在Linux下进行,如果不采用挂载方式,就需要维护2套代码。

2、在我们的临时测试系统中,有些bat脚本需要在windows下进行操作(比如RosaTailor.exe),采用挂载的方式,可以进行windows和Linux混合操作,否则需要两个系统频繁切换才能完成。


编译问题解决:
1、编译的时候出现Value too large for defined data type错误,网上查找后发现很多人在mount windows下的文件后编译会提示这个错误。
  【解决】:在mount脚本中增加参数
                               -o nounix \
                               -o noserverino\
                               即可,详情见mount-project.sh
                              
                              
2、编译linux_makeconfig.sh mptg/mptg_c10时,提示第二步到后面,找不到路径。
   【解决】:这种情况的出现和这个脚本执行的路径有关,如果进入该脚本的文件夹下面执

论坛徽章:
0
8 [报告]
发表于 2011-11-09 17:04 |只看该作者
行该脚本,则不会提示该错误。如果在其他路径下执行,则会提示路径找不到。
             查看脚本,是从当前执行路径开始计算,并不是从脚本所在位置计算路径。所以这个后续需要改进脚本,不能这么死板
            
            
3、编译vos.o时,中间有些步骤提示:sh: gcc: command not found
    【解决】:这个是因为在编译vos.o的时候,会需要suse的gcc,而安装suse11的时候,没有选择安装gcc。但是之前编译rosa库文件可以通过是因为那部分编译采用交叉编译的gcc。
              解决这里的问题直接在yast中,搜索gcc,安装即可。
              
4、编译vos.o时,执行tailor的时候,提示:
============= 运行tailor裁剪工具 =============
../../../host/x86-linux-suse/tailor/tailor: error while loading shared libraries: libstdc++.so.5: cannot open shared object file: No such file or directory
    【解决】:安装的gcc中没有libstdc++.so.5,只有libstdc++.so.6,简单的创建硬连接,发行版本不对。所以在网上找了libstdc++.so.5对应的rpm包,安装即可。
   
5、windows下写shell脚本,linux下编译会出现unexpected end of file错误
    【解决】:到linux下vi把windows下的回车都删除,或也可以使用Linux下的工具:dos2unix也可轻松将一个windows下的文本文件转化为Unix兼容的格式。
1.
目前平台软件结构缺陷:
        基于vxWorks的统一空间
        一个模块崩溃,系统崩溃
        更换组件/升级只能重启系统
        Callback的不当使用,造成绑定和耦合
        AMP结构,每个实例不能在CPU间视负载情况切换/迁移
        BSP与应用没有明确层次
        新增硬件对应用无标准接口,开发困难
        无明确HAL/OS分界,平台移植困难
2.
总体思路--控制面迁移到Linux是重点
        Linux是通用操作系统,适合控制面
        多进程
        POSIX支持完整,可移植性高
        BSP包丰富,几乎覆盖所有通用CPU/板卡
        更新迅速,开发活跃
        更多的功能
        更快的bug修复
        硬件驱动广泛
        其他
        核心机制丰富
应用程序丰富

论坛徽章:
0
9 [报告]
发表于 2011-11-09 17:05 |只看该作者
Linux是通用操作系统,不适合数据面
        实时性差。没有明确的系统时延
        Footprint大。一般Linux需要内存16M~32M
        基础系统空间消耗大。系统>4M
3.
控制面迁移要点
        实现基于Linux系统的硬件驱动与应用隔离,应用与应用的隔离
        BSP HAL功能驱动化,其他Lib/Sever化
        应用进程化
        控制平面驱动需要细化
        尽可能依赖Linux本地应用/驱动
切分出与数据平面交互的agent模块驱动
4.移植实施方案
        期望的Linux移植架构
        内核态驱动BSP架构
核心空间
        Linux标准驱动
        其他driver
        TRAN,数据面TRAN的代理,负责数据报文转发和数据面器件初始化、配置
用户空间
        对App提供与移植前一致的接口
        对不同driver,通过系统调用访问不同的设备

5. 设备驱动的移植—标准Linux驱动
        控制面设备驱动的移植
        USB/FLASH/UART/FS采用标准Linux驱动
        USB hotplug:用户层监听udev事件
        其它非TRAN设备的移植
        TRAN设备的移植
设备驱动的移植—TRAN设备
        控制面设备驱动的移植
        USB/FLASH/UART/FS采用标准Linux驱动
        其它非TRAN设备的移植
        TRAN设备的移植
        虚拟出一个网络设备和一个中断管理相关的字符设备
        Q922/VISP数据访问
–        用户态映射+callback agent+User Lib
–       

6. BSP驱动备选--核心态还是用户态
        用户态驱动方案描述
            用户态驱动
        用户态映射硬件IO寄存器控制硬件

论坛徽章:
0
10 [报告]
发表于 2011-11-09 17:05 |只看该作者
用户态通过线程阻塞读irq等待中断,中断到达,用户态线程被唤醒进行中断处理
   用户态驱动优势
                用户态驱动编程基于应用程序,标准API,编程相对容易。
        用户态驱动调试与一般程序相似,可以使用传统gdb,具备完备的调试功能支持。
        用户态驱动基于进程,在一个隔离的空间,故障或bug导致的崩溃仅限于进程,不影响整个系统
  用户态驱动问题—并发/同步的维护
        多实例访问产生并发问题
        多进程实例访问同一个设备
        通常解决方案
        Server化,在Server内部序列化或使用进程内变量实现互斥
用户态驱动问题—驱动Server问题
          性能问题
        App进程需要通过IPC获得驱动Server服务,通常意义上的IPC,一次请求,两次数据copy(参考后面的进程间通讯)
        App进程异常崩溃,驱动Server需要合理回收资源,否则可能造成泄漏甚至挂死
7. 进程间通讯—copy还是共享
        方案1  标准IPC通讯
        流方式—用户需要组装报文
        管道
        消息队列
        Socket(包含本地、UDP、netlink)-- 支持流和datagram两种方式,王亮比较倾向于使用socket的datagram,简单、可靠、易维护
        方案2  共享内存+ socket通知
        共享内存可以做到数据 0 copy
        但共享内存本身没有消息送达的通知,socket提供通知
   标准IPC的缺点
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP