OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6006|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 , p7 [0 u% u# S! V

  F! Y2 o1 M! H( t$ QOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>; Q, J9 h  ~5 G) v" |9 R
#include <unistd.h># M8 g( ]/ N1 \0 \
#include <sys/mman.h>& P. d7 P3 r8 [' _' H+ J5 M
#include <sys/types.h>
6 Q( y6 c* v. ?8 f2 j: N8 {#include <fcntl.h>( }+ p2 Z8 s  T0 H5 R3 x

" b' e" p" b$ Q#define SHAER_RAM_BASE_ADDR    (0x80000000)   % R; S" U3 m& O+ @+ c
4 D( ^: t- \% ?" d& ]0 J9 P
typedef struct* X& F% L/ N* {5 d% w, Q# D
{& \2 ?8 ?* e- S' Q8 U3 w
        unsigned int a;
8 [6 h0 @3 r8 `& \        unsigned int b;4 f4 R8 o) c1 B7 k
        unsigned int packet_cout;
% P- n% R& L+ d/ @; z& Y}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;1 l& Y& C' v2 b. E7 N$ w, k  J
; p2 u5 i4 v" A) x3 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
  ^3 m! v; t6 c* B# q# @) Eunsigned int count_copy = 0;
, i$ _7 a3 Z- ~% v6 `/ w6 q$ w5 R& }$ Z; E) n

$ C8 j; `9 L) zint main()
9 H8 t# l$ c9 b" _2 ?+ ?{: y; j% e3 L% B: i
        pRX_MSG_PROTOCOL pshreRAM = NULL;; y$ W" j2 `+ ]: w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) s- \- O' U( C$ x! ~7 ]
' ]4 c. a4 b0 [0 ]5 K1 A+ x: x' x
        while(1)
0 S4 E0 o* F- k( o" S        {
7 u0 y$ F( z$ S% p# g1 ?5 o! P9 r                read_MSG_buffer(pshreRAM);
% H* g4 v! D* l        }               
$ [1 ~7 F% Q# p. x}
0 H* I  w) a1 G) f0 C, t7 u7 L& k( q" r- c+ o3 x" Q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)5 R, K! ?$ \6 C4 s& j
{7 ?! r! _4 P' @8 p
        RX_MSG_PROTOCOL buf;2 L" g; k. B% a; m; w
        
7 I; l& p" z9 A3 g4 U7 @        buf.a = pshreRAM->a;+ T* X; t: s( ?- l" w
        buf.b = pshreRAM->b;
6 d: [$ _0 X1 o4 _: i7 G8 f        buf.packet_cout = pshreRAM->packet_cout;
1 S+ {& c7 R4 y3 `: [+ o        
8 j( ^6 f; v/ b  q        if(buf.packet_cout != count_copy)
, f6 Z' X: F* c  F5 n        {
, v* k9 i7 N% ?3 u8 x1 |- o                printf("a is %d\n", buf.a);7 e$ {2 u2 w5 T' C  m( |1 |- j- ?
                printf("b is %d\n", buf.b);
( @+ }% `% ^/ o8 b% q+ Z  U                printf("count is %d\n", buf.packet_cout);
+ Z7 b3 u6 V2 n1 c5 h3 G$ D. O6 E! g                count_copy = buf.packet_cout;
/ e  H1 K  {6 G        }8 @4 z- A( a! I+ F( S
        else
0 r2 S- V& u% A* M0 g3 L$ w        {% `( v8 O  s  X) h5 u- n- G
                printf("No effective message!");
+ I6 ]; i3 M7 E" B        }
. I/ [( o! j- q! L; n9 _5 N}
, A3 i/ L6 [" v: R' E$ ~: ^
) F* A, R0 `5 f5 m+ K, E9 y4 ]. o/ k0 h# K1 P" s
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
8 G1 L/ G5 k: _/ W使用下面代码,对内存使用了mmap函数后:
1 A  V6 R; }# U) o#include <stdio.h>9 x2 g3 ?+ T: Q7 K# p8 i: m& z% y
#include <unistd.h>
4 Z$ f* v3 w/ _+ x. Y9 I4 G#include <sys/mman.h>
, a  I8 |, ]: w  g( @. }0 K#include <sys/types.h>. @  p/ H, b% _  P2 U7 y; k
#include <fcntl.h>: o/ l, B- x: {4 L- ]
2 E6 _" [" Y8 }
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" J) V! L7 o8 @3 h#define SHAER_RAM_SIZE         (0x20000)   , A2 h' N; N# A  L2 }- B
$ }5 r# b; }5 X% g3 o
typedef struct
- o# i& Q0 {- Y; B{
* q5 v: B4 h2 q3 f  C        unsigned int a;
+ G" c; d' ~9 h, `* s/ o: _        unsigned int b;
5 M- G3 @1 q2 g: i        unsigned int packet_cout;
, t7 v, s+ T+ i! S) e3 g# X}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 X+ y, P! {+ N' ]2 h8 V- w- U' u
; |* ^" b7 L& p( V+ H) e: T
void read_MSG_buffer(int *baseaddr);
( x8 X4 S2 ?$ r: A  q: m5 junsigned int count_copy = 0;  Z! p7 v& F& B7 n6 w' q

* s* `4 d; J5 ~' ?5 ^% e7 _int main()8 I; ]) O& V9 f0 z8 k9 ~
{
' X) n9 n! b" Y5 [$ U1 H$ j* Z        int fd;
: z% P4 L6 k- ^, B6 r2 x        int *mem = NULL;
- s8 A7 x. N% j$ S5 ~" M% @' G3 [
        if((fd = open("/dev/mem", O_RDWR)) <0)5 P2 Z& @, o0 r. i& u
        {. ?( y; l; P0 U4 a# m
                perror("open error");
9 L! Z( C) U1 X% ^0 L* \                return -1;
- `: j8 J9 `$ P/ \# ]% B( |; k2 ^        }
9 ]+ {- x+ h6 G5 k, g8 n1 l        9 Z& Z! U; B1 W. E9 W+ L! Q
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ E+ M: ^! G" O- e& E5 X2 A4 R3 M
+ y5 C7 _/ C* _0 @' I) a; N
        while(1)
  K' I* l/ x1 N# O" Y        {  N$ e. D; p2 }# d
                read_MSG_buffer(mem);3 n0 T1 U' x: D4 t
        }               
7 `3 ?2 }% z* ]8 _7 F) S}
  f: \$ U( Y/ T* K
% C' \* b! L4 j; f% H# I" M; B  Svoid read_MSG_buffer(int *baseaddr)
8 v/ `3 m& i  {( x4 R* }  R% b{) f1 F) k; c0 y3 L, [
        pRX_MSG_PROTOCOL pshreRAM = NULL;5 y- [& E: L2 b8 \2 R; ]3 g

- G( M: L$ s! E1 k        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 F" m) T/ @! ?  p
: k6 I" }+ u; U7 B( \, T        if(pshreRAM->packet_cout != count_copy)1 [! ?- A$ s3 T0 b3 J6 t
        {
) s5 B  c$ w: r8 @) M) C6 _2 p                printf("a is %d\n", pshreRAM->a);0 |: N+ a4 m  e  q5 A' i* {) [) \
                printf("b is %d\n", pshreRAM->b);
5 q+ k$ ?& E4 M/ ~0 \                printf("count is %d\n", pshreRAM->packet_cout);9 v  {' ?2 U2 O1 V" s
                count_copy = pshreRAM->packet_cout;
8 F  Z* L5 X. `$ }" H$ o        }3 i9 q( G+ }6 d7 V' h$ S
        else3 b) E, }6 h1 ]6 V0 }" o
        {/ f/ G4 v/ Q- K. ]2 ]8 l
                printf("No effective message!\n");; o  L- e  {5 V2 j$ T
        }8 m* y5 k" ~" D9 P
}# V- ]& o1 W1 z( U

, Z$ j; c8 R6 Z7 l$ w  H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
2 A  U) @4 j2 n0 P% S  \, {) Z2 m8 ?3 o% |: c4 X! K2 S
0 A, j; n+ W9 t% B9 Y" E

9 j! E$ F; Y4 q; t' \; I9 K! P1 s5 D: r* `1 a/ p  a1 J" m/ W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

点击跳转“创龙科技服务通”

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-3-29 18:37 , Processed in 0.039358 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表