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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
0 G( y# \6 x8 @5 s! ]; N
1 s/ u2 {' F( A4 hOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>( h' ~4 Q. L" ^4 F' Q( k  W, q
#include <unistd.h>. F! Z- h2 ^1 e) l
#include <sys/mman.h>( @2 p4 j* `: c0 E( L0 ]+ ?+ S+ b, J
#include <sys/types.h>
: w+ r3 ~& S" g: z5 N8 T#include <fcntl.h>' I1 ?- K! o3 J2 T) Z+ s
# D4 ?/ Y" Q5 C( _# u' Z& _
#define SHAER_RAM_BASE_ADDR    (0x80000000)   0 d. n1 Z& `1 `1 J4 N
. D- m+ `9 P. g2 v& h; x
typedef struct
9 J1 Z3 ~* j# X$ B* l{
( Q! R2 V2 R/ E% {5 Q. `0 r1 e( Z        unsigned int a;( D8 [' E6 ^  n
        unsigned int b;( A" ]5 \9 G8 B: f( s% H$ P5 g
        unsigned int packet_cout;
5 y7 K+ ~1 j2 l, c; n4 W+ E' f' M, f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
1 y  L8 M. d5 F5 l9 V( H6 W( n' f  R5 b2 f; u$ A. A" ]* [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 ]5 n$ j  Z& x. s
unsigned int count_copy = 0;7 }1 r+ d+ @( ^7 ]$ z

- E' C( r0 {! C4 G3 t& @! q; U  ?& E! R
int main()
; _( C# |/ k5 u4 d" V{& b+ U0 b! M2 s  D
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ C, z* ]% M  l1 Q6 s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
7 m; O0 I0 P6 L# k; N
. x& [/ D- }! m6 _        while(1)
5 Z: Z  ]) @1 q# F+ U        {- o$ w( y. }$ n- N: b# }! G1 ~1 _
                read_MSG_buffer(pshreRAM);
1 f& p. m& z2 L# I: U3 d; O7 o# Q        }               
% }9 d- ], x2 y5 ?}* o) t/ |# @0 U3 [- ?3 V. a

0 f# y" S; j* p! [- b4 f% Jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)9 a# @0 Z& O9 D3 X  X
{
% ]5 c+ @7 R. \* Q) o, n, A& l        RX_MSG_PROTOCOL buf;
2 D, B- U' g5 P, w        
2 s4 P3 ]9 u8 b/ V3 q        buf.a = pshreRAM->a;. V4 P2 t# Y1 o- V! X# Y
        buf.b = pshreRAM->b;
( A0 |( G& c  ?        buf.packet_cout = pshreRAM->packet_cout;1 j) \/ }* m5 D( ^2 e  x
        0 |: S2 b' n7 `# y1 u
        if(buf.packet_cout != count_copy)
  Z- x  Q/ ^# E        {
: Y5 r3 Q8 g1 c9 i+ z. \                printf("a is %d\n", buf.a);' H4 ?4 h( R; d" R2 }
                printf("b is %d\n", buf.b);
. g6 n! v6 o. `1 q                printf("count is %d\n", buf.packet_cout);
" @! O  b) V! I7 i                count_copy = buf.packet_cout;0 H3 [* A% I1 _& V+ X. K' y- a* Y
        }* f0 g3 @( Z/ V' o. o2 h9 v
        else2 M' x3 t7 J' {
        {
7 @8 V" c0 K7 g1 n1 m/ l                printf("No effective message!");
  P; ]1 x" {& A4 i- U6 C! a2 J        }
5 L- D6 a# {2 X" l  X}
. w, ~% ?  ]. M- i* Z2 w
; H; E# ~- Y9 S  N; x/ w& i9 w
: u+ E& m$ p! X* k$ _但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。, j. ]9 |. Z1 A! J7 i
使用下面代码,对内存使用了mmap函数后:  u. U$ f6 @) h6 L" Z" B
#include <stdio.h>: I$ \+ J' o' N+ w9 T
#include <unistd.h>
0 F  q$ n' Y4 m7 F! s' Z$ }& E) x#include <sys/mman.h>
/ K9 T+ l1 x2 y8 v1 ^$ ~% a1 @) J#include <sys/types.h>
4 c  k! J! G6 u$ ~& O#include <fcntl.h>
; f4 S; N' n+ h9 k
( a8 r* \5 t. p  v0 |8 O9 ~#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 q: p+ [* Z9 ~# C#define SHAER_RAM_SIZE         (0x20000)   5 S% C* q0 w3 w8 h9 t+ E
* p- c, s3 F& O4 c
typedef struct1 m) r) Q8 M' N
{
3 w9 }! G3 U+ J        unsigned int a;- g+ F' i2 @) G& j' F( u0 k
        unsigned int b;3 N' t/ k" E( _( e1 I! k, l4 w
        unsigned int packet_cout;
5 b; Y+ I* C9 c6 z3 q}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 d+ D- j* ~" q, E, b  U
0 p1 Q5 R: G0 f
void read_MSG_buffer(int *baseaddr);" m" I! `3 `7 m  c6 q  \: K3 Q
unsigned int count_copy = 0;- ]2 [9 {( n; i0 c
$ q' x+ k' }& @. |% L
int main()
/ l% N4 r- @& S' ~: S( X, S! ~$ ^4 i" _{: h& s1 x! _3 G5 D
        int fd;$ W% I$ E7 }+ N2 E0 c3 ?9 ~& F
        int *mem = NULL;. E2 D3 h, P8 A6 }) v
# l" e8 K6 l( k! f
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 s/ @% m6 L2 E# f/ N9 [        {1 v+ s9 b6 i0 \2 N/ |+ F
                perror("open error");
6 N6 O. M) \& y4 n- a+ n+ t                return -1;
2 K6 n5 D: Y8 y9 w8 T  a0 F% p: |        }' S: J* |" w! ?+ ^; Z4 x2 ~1 c; l
        
& k$ }! N: z: `        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);+ d! [: b5 N0 K1 Q: j$ y% }2 i* j
- ?5 Y& D& g% j  X% @' B4 W7 F
        while(1), E7 l& T9 e7 P0 h  M
        {# W7 q2 ]9 Z! M. v! q  j& v
                read_MSG_buffer(mem);* M# F/ b3 |; c0 ^
        }                - T9 y6 M3 O" M+ v( ?- A
}
8 T+ T  [( a  j  ]) z! S9 S0 C# ^, [  \" h; o$ m2 Z4 U  ^# B5 \% ]1 H
void read_MSG_buffer(int *baseaddr)
: m  ~' ^* q/ m: v9 j- u{& x) P4 p1 S9 d: x; T
        pRX_MSG_PROTOCOL pshreRAM = NULL;# b' L1 a0 K  I$ j2 Y) l  o5 w$ Y3 h8 Z

8 ^; _' H3 g, u, o4 v( h( O) ]        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
6 O8 G# Z8 i* [$ t4 k, e
0 W( g9 n# e1 `: [3 J: }2 t        if(pshreRAM->packet_cout != count_copy)
+ j; a  O6 |: `" j        {
. K! `7 E( ?# v4 A                printf("a is %d\n", pshreRAM->a);& G  h: ~* ?) a; ~* A' F
                printf("b is %d\n", pshreRAM->b);
0 p) D% w5 z5 T4 L7 K# ^                printf("count is %d\n", pshreRAM->packet_cout);& Z- L/ t# o& j1 j" n, Y' d" B! N# P( M
                count_copy = pshreRAM->packet_cout;
* c$ D0 Z4 z3 Y8 e( z9 L9 N        }+ c1 r: ^' s/ V+ M1 c* f9 z$ |; O
        else
; x4 P. H* N8 p5 s# i+ y        {
. I' d' w! X, J$ d                printf("No effective message!\n");
: S6 I2 F( i: v( m, r+ P+ h6 ?$ N+ t( ~. }        }
3 ]3 U* k7 Z! a0 _) t}
+ M- w8 m, a8 ]) p3 H2 J: k- [: i; @
# C+ M1 F3 I0 `没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
" g2 c; w* Q  f% ?2 ]8 V* x: C. Q3 E- U2 d8 A

% ^5 R; Y8 c: Z. b2 s$ ?( |! d
' k4 G( b9 S3 G' X; w8 `# C9 E3 i2 j' _$ M- y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则


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

GMT+8, 2026-1-9 17:15 , Processed in 0.040327 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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