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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! \4 d; K: s0 d6 v; ?  q8 c

! e* \9 n. c6 r1 b3 U: gOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 q- t7 u1 e5 V" v
#include <unistd.h>
6 U  c5 m: l% o! z#include <sys/mman.h>
" j) B0 r+ ~& V4 p9 a1 t0 s) S% U#include <sys/types.h>
3 l" v2 W! }8 Y! B6 J- P7 m#include <fcntl.h>$ [6 Z' Y  H  K( ?+ f5 b: `- I5 j
5 \% b2 z; R6 ]5 w! E) I: f
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
: P' C/ b. z8 ~- w$ ~+ Q
8 q) _9 b4 ~8 U+ |typedef struct
+ m4 p) R% j5 o" d/ b# H; {( u% R{9 p0 ~5 h6 j3 p: c
        unsigned int a;
  ]- ?5 n: ?5 |0 E        unsigned int b;& O* f* q9 {' J5 W/ s* m
        unsigned int packet_cout;
) `+ X0 o" N0 v3 |; L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;2 s4 O9 U" L! E& o, O

/ _" d! V! V* y3 s, X3 z6 d. ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
# g% g% M# \# h6 [- s. Tunsigned int count_copy = 0;* X) C/ _9 x) y0 ]# Z9 R0 y, w

* R: y9 ?" D. P
& W# i  d" ]- p, U/ q" p  T- hint main()
# V4 `. b5 t; A% P4 I% [{# X: L) _1 ^6 Z2 |+ P& D
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 G3 ?9 y& r) T1 ]6 Q
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;  O" b; H5 B9 G
& }8 {; w  X0 W
        while(1)
$ U+ J! M! I, {        {1 I+ X, }: Y6 t9 k
                read_MSG_buffer(pshreRAM);: [* a( Y# W, Y
        }                ! k/ p. g, J* v- a8 |! X! @* O
}
5 Q2 Q; ~8 f+ J8 C6 r0 J. H1 v4 u2 H$ a
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
) J/ p; S' ?2 M9 \{! [  t( N8 A9 ], R& H* ]2 u! d
        RX_MSG_PROTOCOL buf;7 {+ U2 p% E' ?; l/ o
        
& D, u  y* `( z- l8 y0 f. _        buf.a = pshreRAM->a;
# Y0 w: M( l. F; f3 P# ?        buf.b = pshreRAM->b;; Y0 Z0 b- R- r2 T( h  f
        buf.packet_cout = pshreRAM->packet_cout;
2 u1 n  T$ }$ Y4 Y4 \( I$ z        $ T1 X' d  y' y" |( G( ^/ l
        if(buf.packet_cout != count_copy)
: [, u" G# u7 }, r5 p        {
8 |0 \7 {2 w/ o7 d                printf("a is %d\n", buf.a);
3 B$ Z& \* u  W4 @* T8 g) a- j                printf("b is %d\n", buf.b);
  w5 }9 g* [# E0 z                printf("count is %d\n", buf.packet_cout);
9 @% `0 ~6 k' G: z1 O                count_copy = buf.packet_cout;
- H0 ]' p+ V- d        }
: b! _! N+ S- O4 t* `        else
8 r1 a9 R0 t0 G2 a% o8 u        {/ o2 L) J) `# `5 V+ [! F
                printf("No effective message!");! u  c& o& K# D1 \; n
        }! R" x& H7 p4 y) m! k+ [) x( _
}3 }& Q; z( W" h

2 l* l! n) B2 m! ~0 }/ k& |7 q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。  I! O0 s0 n( C4 l8 I, b4 z# R
使用下面代码,对内存使用了mmap函数后:
% ?! ^/ K, J" }$ [#include <stdio.h>
& x3 [9 Y: Y  M5 l#include <unistd.h>
' B& s( [! D' ?$ W#include <sys/mman.h>
- j( k1 Q3 [- Y0 }9 w- Q: Q4 _#include <sys/types.h>
, w; v/ m" F- ]( c/ R/ t. _; O& x, ^% r#include <fcntl.h>: V( J  K+ v" r  ?! |1 X  V# o
5 f! P# k4 r% P) q
#define SHAER_RAM_BASE_ADDR    (0x80000000)
" y2 I; [% I5 Y; O# c& t#define SHAER_RAM_SIZE         (0x20000)   
* s2 }1 g9 o4 p) f* J, a: z! _  F5 Y4 c; B. ~$ Q
typedef struct% c- m8 @8 `' v' e# }' h5 \
{
: w# C. {, `( M' s$ \        unsigned int a;
9 p: e( K8 q& a" i0 a        unsigned int b;" p0 H' ~( p/ z$ ~/ l/ U
        unsigned int packet_cout;" G7 X/ ?' Q: ~& I' o' L0 q
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
0 F1 m$ d3 m' ^! k% ]3 |; N* K' ]- N% o
void read_MSG_buffer(int *baseaddr);2 `: j$ E1 F3 n
unsigned int count_copy = 0;7 m  o- W, ?8 u

  N6 S* p. j" T! s& f3 k7 hint main()/ g) n4 z% ?4 A2 H4 G/ E! S
{, I% m2 t) K- X
        int fd;( F5 I# b* q6 A+ Z( ]
        int *mem = NULL;
* R# R. d& T9 t! b2 L) C, Q* j  M  G4 }; y0 H6 K* t& ]
        if((fd = open("/dev/mem", O_RDWR)) <0)3 l, s3 j  \; w0 j$ Y+ E% p+ J
        {
3 `' W( x6 e) k4 k2 j+ P8 E9 C1 C                perror("open error");7 b: b& h& \" h7 `0 w0 `1 g( h
                return -1;# K( O, A' ~+ ?& O5 M, g
        }
3 j, u, ^/ _/ D, B/ W. n" @0 r        
: K+ k% `5 G. J5 M        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
2 E6 o8 [1 X% L  J2 ~
# G! t$ q8 p* J6 S- h. _  V5 C: a        while(1)/ C( p$ I! s' S; m, @' _
        {
- a$ L5 g; N; c, r6 T" i- E% }                read_MSG_buffer(mem);- ~1 M7 ?. {* v2 M) b4 i
        }               
* q0 v9 A! E1 T" v3 {! u4 H9 X# `" B}( |% O5 w( l# _  d9 l1 h* V
% j7 @+ F4 z: F4 n6 j
void read_MSG_buffer(int *baseaddr)
" H$ W# _2 [# u/ n$ _{: `( E( i7 G/ u6 C5 Z9 U4 m
        pRX_MSG_PROTOCOL pshreRAM = NULL;
( x& V0 g/ W3 g6 d8 _4 G+ y
3 `( [3 U- k8 U( u; s        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
* _$ a5 D+ \5 U1 }5 S( A+ u1 S& q% X# F  ]# n
        if(pshreRAM->packet_cout != count_copy)9 N7 r# K/ [' B. T
        {. `- y: {8 K4 ]3 m( g5 {' s2 i  {
                printf("a is %d\n", pshreRAM->a);
; ~5 X) j3 B% f+ a+ O! i                printf("b is %d\n", pshreRAM->b);2 q% `# S9 W- Z* F- J
                printf("count is %d\n", pshreRAM->packet_cout);- @  ?8 O4 W3 {2 q! {
                count_copy = pshreRAM->packet_cout;
; {+ V3 h: A# Q$ g) h7 z        }
7 H, H9 r' \7 A# K        else
% x7 \; {5 \6 f/ W; Q        {# s+ K8 C3 N  V
                printf("No effective message!\n");8 t0 y; o0 S- l: J8 F. u5 v" h7 I
        }
: X3 f$ u" m0 @}
* z# Q* k; G+ k# D0 {7 U! k* t/ @
- K6 a, I1 ?. |' m2 c2 s没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???. n7 \, |1 k/ i! c$ B1 ?
9 j* E1 R4 @% k0 \! n0 l$ N( y

3 X7 u. ]9 A! i7 u, u1 v- r8 E# Y" {

& p7 R$ w; _$ l6 X6 @( O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-10 15:52 , Processed in 0.039903 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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