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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
7 Y' ?. E, \. F5 A3 y
9 x  e: R" g" x6 q& h3 `OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
: }$ M; L# a8 x- n# R0 r#include <unistd.h>
" e& u2 `) }  J+ d. }' [#include <sys/mman.h>
5 b& }: D+ M( {9 C9 {7 b#include <sys/types.h>( z  p8 O1 V9 O$ p
#include <fcntl.h>
" o( X4 F& ~3 u# E* Z. n' \$ O9 q4 {& N3 {( K1 r
#define SHAER_RAM_BASE_ADDR    (0x80000000)   , C. q- u& I# m* W* ], V

6 g+ q" j7 Q0 gtypedef struct
. q  L  h' [1 p0 P/ Z. a{
/ \' ^$ [7 `% L3 i        unsigned int a;
: o. @' o% X7 T5 V- i; K! J& v        unsigned int b;
0 T3 h  _, H% S. x" b0 ?8 I2 \) S        unsigned int packet_cout;
, Y7 D$ N1 v( S$ a) \/ K% c: e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;' |/ \5 z# F6 [3 ~7 M
0 q5 x( _1 q7 ~
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
. U2 }5 Y  a4 h% M$ Yunsigned int count_copy = 0;0 H" r* ^4 n# h! j/ g' P- O- x

1 e5 y# K1 M& J) m! R2 g+ t) p" F% e2 ^! w. z4 [6 }7 C! V. g
int main()+ J0 \& b' H" l' q- g
{1 b9 @2 C: J% I, [! j: L; F1 F
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) P8 u3 I( Z3 _- f        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
2 E  h. ~% K) {; o: N
: p7 {/ X# _. q7 a9 P        while(1)" M; ]; b" E% ~+ o
        {
1 i# t( V. }* A' W                read_MSG_buffer(pshreRAM);
6 P) s1 u& d/ y$ v& n        }                . m. b  q1 M7 |; \
}9 o- U$ m1 t( b

+ \0 k/ _# \0 [# j* p2 }' t3 c) xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)+ l$ p1 B- e% f+ w7 `0 R: x+ G
{
1 q" U* N# h6 \4 _        RX_MSG_PROTOCOL buf;
3 P9 p3 c4 t' [/ a1 f        
. l. l7 @8 d" ]  X        buf.a = pshreRAM->a;6 D! o5 _! E; G) g- Z$ k0 U
        buf.b = pshreRAM->b;
/ ~" R& c$ V2 h* w1 [$ y  ]        buf.packet_cout = pshreRAM->packet_cout;' n  K1 x$ E: k0 `
        
2 m- F3 S0 Y  i0 Q+ ~5 \        if(buf.packet_cout != count_copy)
' [6 S! t3 J( q        {; Y# d4 n9 G) d0 J" V
                printf("a is %d\n", buf.a);' D: H" R  R/ x: Z4 i9 V8 m( G* p
                printf("b is %d\n", buf.b);
# }2 `3 F( @, u  `                printf("count is %d\n", buf.packet_cout);$ v/ r/ z7 ~9 E: |) E6 D. ^" m
                count_copy = buf.packet_cout;# Y. a) ~, A2 r6 f2 Y
        }, W. P1 Q( I* x
        else
: e% J: \9 F& H        {
* l+ w; |! c: ]; ?2 Q3 V. Y! F3 Y                printf("No effective message!");
7 I6 e9 p" N% K- e0 {# a" M/ \* ^        }
; j7 g/ F+ {0 J, {; z- U}
$ P% f1 P0 B2 ~4 x% u6 ?4 A6 o, w. O6 B: ~  U

$ p) G5 c1 B: U; \  ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。6 }( g& _0 S+ m$ }
使用下面代码,对内存使用了mmap函数后:$ \! |  U: s6 q- z7 L
#include <stdio.h>
5 n1 U/ x' F: k" W: Q- u; \#include <unistd.h>
* y) V( k1 a! e1 `4 C6 x#include <sys/mman.h>, \. s$ ?- E7 e
#include <sys/types.h>6 e( l; i. A' h- b; Y
#include <fcntl.h>
: }  z* E' ]" y2 }8 ^6 h9 B! @" m: c1 E* a5 \$ [* j
#define SHAER_RAM_BASE_ADDR    (0x80000000)
0 H: I% _% [, p7 x* h7 s- B#define SHAER_RAM_SIZE         (0x20000)   ( R% a% M% _& g; L" l) |/ S) G# P
1 V6 Z$ p( W* \
typedef struct
, d8 U& Q, \# ^4 J; X) g; h( S{
+ C- P  f9 q/ V* H6 d8 |        unsigned int a;4 M. N$ K9 p1 K. E# G
        unsigned int b;
% @. v3 f$ r- H; W        unsigned int packet_cout;
7 a% |! V! Z# M+ g2 x9 t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;3 [' \- z3 Y' _, \/ U+ b( z- f

! @, n# h3 o) g) f, X. l6 i! V, I8 Bvoid read_MSG_buffer(int *baseaddr);/ M' W" h/ f8 ^4 J9 p9 X7 @# c
unsigned int count_copy = 0;
3 t& Q! h$ L7 @2 @7 t2 b5 Q
5 z0 q5 I# N" I3 J# l! m  p8 ^4 ^) dint main()0 m# h2 }9 R. U" n4 g- `$ t: I
{
6 i; Q; Q. Q: T  K3 {        int fd;. Q8 e/ i" I# a' u! J) Z4 _
        int *mem = NULL;
6 Z4 {" e, W) R$ V' L! Z: ~, X
2 v2 G/ ?3 b2 `& a: u: M        if((fd = open("/dev/mem", O_RDWR)) <0)
% V# c( ?: `) g1 H1 }  I        {
& F; d1 J% q5 c; |                perror("open error");& a9 Z" P8 i! Z" K4 k$ U
                return -1;
( H+ Q3 d9 m7 ?% K# C. L        }
# M0 s: n0 Z) o/ Z- a        
8 v/ g7 `$ w8 N        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
* T, Y/ n3 H4 Y  d4 H( d1 X* Z# d3 W( Z0 L  F4 [( x$ n' W0 \+ l) M: I
        while(1)
, G+ A- l; g+ `- ~0 u$ {4 E% T        {0 x& a% \; D1 V: H2 v* e
                read_MSG_buffer(mem);
# g" t  e- K9 U) \        }                $ \$ x! g% d; Y; B& P5 P
}
& N& D( C. Z/ s& o% z0 c2 j+ E2 `* g: o; s3 r0 h- s. ]. B/ D
void read_MSG_buffer(int *baseaddr)
3 o2 J& @' O8 ?- k' R{
7 ~/ C$ \# ]! [" @4 ?        pRX_MSG_PROTOCOL pshreRAM = NULL;' |' g8 N5 f! [

+ }; v' i( O8 B5 V7 i        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
1 U1 U- e. j# T$ B$ {
% q' u9 S- w! o8 f        if(pshreRAM->packet_cout != count_copy)0 B) P4 `9 U% b
        {
  c  ?; |+ {5 q8 o                printf("a is %d\n", pshreRAM->a);1 l$ _( B4 N% v% S
                printf("b is %d\n", pshreRAM->b);: Z5 n. y1 D3 V7 V3 ?9 B6 f
                printf("count is %d\n", pshreRAM->packet_cout);
" Q' U: i' K* N4 d9 W                count_copy = pshreRAM->packet_cout;5 f2 A* M" w' }* {& X4 U4 S
        }' c) K5 r7 K5 J1 J* S' [# \1 n! p
        else
3 ^5 p6 z% e6 ]5 P$ z        {
9 q8 [7 @/ L; r" K  S: b                printf("No effective message!\n");
- ^4 @6 I2 w3 K. C5 y) `( h; I        }( W- M  Q0 C; R% z7 b. P1 f$ j
}7 c! m1 a! t0 V$ x( {" f2 I

" |0 I* m' E) L5 B& P5 T& ?# \没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???5 |0 Q9 L5 H# O! u
- o1 a. x8 |+ F2 C6 A, l& A* f% ]

% x) w& R; S/ Y1 V
  C! H' [& R1 |: {) q
6 g2 d! m3 L5 `9 z. N  Y
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-24 13:07 , Processed in 0.039018 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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