OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
3 V8 R  n9 r7 }
+ p* e3 A/ @7 A8 KOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; @5 ~6 @5 E7 H- u2 x) z#include <unistd.h>/ ~5 P# a/ P2 P1 j/ T
#include <sys/mman.h>, a& w% _& A( L  V
#include <sys/types.h>
" ?( g- i# m8 F* r; w' I#include <fcntl.h>
* w# _: m$ v6 X" Z$ K& U9 b& P; H; d" f! y: E$ S
#define SHAER_RAM_BASE_ADDR    (0x80000000)   6 G  w0 C) d- k0 z
% J0 L- {# i; K7 W' e/ |
typedef struct
( P. {4 {( |  L8 r{
- A6 M/ W  D8 O: D- x. {8 G" q        unsigned int a;) s( n1 R5 F  O1 g. ~- O4 y0 x
        unsigned int b;/ b" P8 h/ G/ z+ S
        unsigned int packet_cout;
0 _6 @5 m5 t* S; S1 n( c}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ ~4 {- E0 ~7 Y4 x! A

$ o* t1 f7 I! G2 {# y3 Dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 ?" J. q. j, b1 H) B* U$ ^3 ^+ ?unsigned int count_copy = 0;
2 _; C3 l2 c1 |5 G4 _% C1 R0 H" B4 D: N6 g

7 G1 [+ F; b: J6 _3 R; j  jint main()
/ \+ M) [7 g8 L9 v{
7 |! u' ~7 z) b        pRX_MSG_PROTOCOL pshreRAM = NULL;( T1 j2 J1 M; O
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;& }) V" Q5 f  j9 [, j5 }2 q

+ e# G- t0 d" D6 E8 W; y        while(1)
+ x! S! }+ O1 ?0 ]  n" Q% J        {, i* h  B2 x4 u6 k
                read_MSG_buffer(pshreRAM);2 d+ O1 n! h' }! w- O* o9 T1 }
        }                + Z7 E8 `3 F) S2 ^3 y
}
. e1 R5 [% D' u- L- ^* ~% R' t  m# r% w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) p4 A/ M4 D6 Q9 i5 I+ f- Z$ @{
# ?/ _8 \6 A/ w8 U+ w) e. R  U        RX_MSG_PROTOCOL buf;3 D2 d! H8 p0 V6 [
        & S* F9 l. a$ K* O7 E' t  K* b
        buf.a = pshreRAM->a;
* p! _' V" U& v5 C, K6 a+ H        buf.b = pshreRAM->b;
8 X# T1 b- V* D# x        buf.packet_cout = pshreRAM->packet_cout;1 [3 E9 }0 o$ O5 Z
        
  i: m4 r  E" Y) [        if(buf.packet_cout != count_copy)& R& w9 g% ?7 m" j3 t
        {2 a  }* q6 Q) M$ N) l7 h. h+ g6 E
                printf("a is %d\n", buf.a);) q' k9 S" Y' E1 y: }9 M8 m) J0 H4 a
                printf("b is %d\n", buf.b);
$ f; G+ q: `& i# T' \5 Z/ {5 M                printf("count is %d\n", buf.packet_cout);
7 T" n  k8 G& j- n9 U. ^                count_copy = buf.packet_cout;
, {4 a4 r2 R, i% r- D, A        }
' h" A4 [9 x8 U  m+ O+ ]        else
1 u5 e( T4 Y8 y% c% j, ]        {
5 P8 Q& e6 k/ `# c6 F                printf("No effective message!");
) \/ a  I2 {% {! r' n6 X        }
( i5 l! r* B  j6 T}
6 C/ [" Z- [" V; ?
% T3 ~4 c: c) n6 }
+ c3 m% ~4 p2 z但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
7 s" }. C9 O$ R5 [' i- Q使用下面代码,对内存使用了mmap函数后:! \$ T, |6 t8 e/ G7 J; B/ n9 x
#include <stdio.h>
/ R3 e: @9 M" I! S9 v* _#include <unistd.h>
, c- A* ?) h7 l#include <sys/mman.h># n/ F/ `8 I. W6 M
#include <sys/types.h>: z$ P( k/ `# A/ s
#include <fcntl.h>
- K1 J6 W* U* ?/ U
8 y0 q: n+ ^/ R2 y2 p1 Q# p#define SHAER_RAM_BASE_ADDR    (0x80000000)8 P0 l  d$ y9 g# T" S' e$ c" B
#define SHAER_RAM_SIZE         (0x20000)   ) K# ^% I" ?: y- ~5 G( P
/ R0 k: `/ ]" x) W; O
typedef struct
) s$ _6 g& X$ z$ b( s; d* D4 y{
: x, e1 ]8 F) J6 h        unsigned int a;: J5 H0 T4 O: u3 _" m" I9 B  }; x. @
        unsigned int b;
! K; D6 v, k6 S9 b% c4 i        unsigned int packet_cout;
8 E/ B0 n9 W2 V) S8 v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' h: j& P- T0 S0 G  |6 d

* [. K* F/ u! T% Z. Ovoid read_MSG_buffer(int *baseaddr);
8 K2 H& s# L; }' P  lunsigned int count_copy = 0;, P; E9 l0 p/ q5 a1 O7 j& g

; K4 K5 u; n7 r" I/ L  `( kint main(); K7 R+ `+ W* S* h7 @5 j
{
5 V2 P2 C, I  g$ t/ e4 B! }4 g- G        int fd;
1 X: A. k* x+ a3 T        int *mem = NULL;
% q+ m( U9 D. ?8 X" s% z1 s" a, r& \$ F! t! e$ d* {- I- T
        if((fd = open("/dev/mem", O_RDWR)) <0)
' ]* V4 u! {& [- F* k" Q        {  @5 B2 e- p* X/ ~9 F9 r: a: K
                perror("open error");
( ]' q$ M+ I  N+ A4 J                return -1;/ z+ \! n; `' T/ ?2 w
        }
1 Y9 W2 ~% f* Q% G2 n        
( q) A4 @. F- y1 |        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);9 I5 p5 U  V  `) U2 \. }8 G

! b! j. J4 V# h( t        while(1): e1 m) Z$ w& ~5 {: g. ^3 p  O
        {8 i8 b$ x$ E- ]/ A! `
                read_MSG_buffer(mem);, |2 T- A9 f5 I9 U& o) O: \2 k
        }               
3 G) N9 K) p$ @: L. F' a}
4 s8 B2 v, M# w/ I3 u
+ ?, X7 a3 M) Gvoid read_MSG_buffer(int *baseaddr)
* R  C( C' y, `$ J{2 l: a8 Z5 Y- E& o8 P% j
        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 Q9 r1 b4 T/ l& @
3 V  I: n$ n1 e" q        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! ~5 ?2 ~+ Z% a/ U* c  ?! t  h
8 u, _5 b7 `3 I2 F4 [. w; g
        if(pshreRAM->packet_cout != count_copy)0 P/ ^( B2 w( q( q* D- n: h' |
        {; h' ?4 {  Q( ]1 o; H$ g7 ?8 n8 x
                printf("a is %d\n", pshreRAM->a);8 m2 }2 L0 O% L/ ]: y8 i
                printf("b is %d\n", pshreRAM->b);7 c5 N3 U7 K3 g. |, I$ b( }
                printf("count is %d\n", pshreRAM->packet_cout);
4 T- ~. @! i7 x8 g: e                count_copy = pshreRAM->packet_cout;
- x& q" T2 p: G# c" d  Z* v        }
6 }7 n. a8 f9 f( G  Z        else
2 m3 q  w0 s( U5 D        {
) _" I1 X) h0 l  l6 o                printf("No effective message!\n");6 ], R. y' d2 v- j) N2 _
        }) ^" s& B  w% H% K' X  y2 X- M$ S
}6 _6 f" D' f! f2 w

: N/ F% h0 T6 G2 M! i/ X没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???! [) x) Z) o0 |7 E0 q& n! O5 c
' k0 s: E) K0 y

) a# Z. W5 C4 ?  O2 \; W& v
4 V: _; c; d+ h. x" i
, G6 s( t( Z' a
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 22:37 , Processed in 0.042130 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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