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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
! \+ r" |, H. K' y
  d- L5 Z1 R* r: R; z, tOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
6 W0 O8 w% z9 d# J9 a3 p  i#include <unistd.h>! `: F3 K( u3 ~
#include <sys/mman.h>* Z$ W- z2 l9 p* X0 ?! T
#include <sys/types.h>
0 W( G$ {7 f1 q2 ]. }$ r5 J, \# _+ ~#include <fcntl.h>
6 a) `4 s+ [: q2 L) @3 }8 I- v) J% y  B" w0 }$ y# ?% ?
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 ?# Q+ U3 K! R9 y% ]& }
6 p( A# I9 v& Z& G( etypedef struct1 J! S6 Z7 s: u5 \7 @! Q2 x
{
2 F& B! P1 h( l+ ?( x7 X        unsigned int a;
+ [8 a* Q7 u" H) A8 p7 i$ f% k1 B" s        unsigned int b;
2 [. U- S9 X& H4 g) `  G! s        unsigned int packet_cout;( k4 x6 x7 S# \6 O: f' K6 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- C' K' L: E# r0 G/ F" B

1 i( D* W" E( W( L2 c4 ?, U, ?2 Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 U' t# G2 c  d/ b; m2 junsigned int count_copy = 0;
4 _) n9 ]" l- S# g( H7 t8 ^5 r/ `" T! o, I' n3 M

/ R9 u, a# K/ P8 {0 }1 k4 M/ a, ]int main()
+ G; P6 ]3 j( V{6 Q3 t& y. o9 s6 P
        pRX_MSG_PROTOCOL pshreRAM = NULL;
; Q* K# Z: n7 V! N  e2 k, }6 ]# I5 `        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;1 V+ B& J3 Q8 e

0 K! o8 O6 r5 O        while(1)
& p; d; _- u( x8 V6 e/ H* j* x        {8 u+ t& w- G" B5 C6 n
                read_MSG_buffer(pshreRAM);
6 G' W% R: P5 h8 E' r        }               
! x$ |' L) |8 e8 F* i}. R, m9 s0 r, T4 B

$ q9 ~7 q  ]" J7 S; Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 E9 R" F; y7 f2 {& T2 k
{4 B+ t  i/ r; o/ p, u) d" Z. e
        RX_MSG_PROTOCOL buf;
& ]+ j/ K, g+ A        # I7 K1 o9 A2 T; T
        buf.a = pshreRAM->a;# l. Q0 `3 a! t' r2 y/ q
        buf.b = pshreRAM->b;% T; d# p0 R8 q5 f# _1 f6 x) Y9 Y' T/ B3 r
        buf.packet_cout = pshreRAM->packet_cout;
* {& V5 s. p3 ~' X5 {        
! P( ~: Y  U+ Q0 P7 H3 O        if(buf.packet_cout != count_copy)
! a  Y$ J, e. X/ e: N3 ]        {$ h6 |/ I1 f/ C7 |$ D2 K
                printf("a is %d\n", buf.a);
5 f. V. h. n1 t                printf("b is %d\n", buf.b);
; Y* B) R( y; u' O, ~- r& p3 L6 J- b                printf("count is %d\n", buf.packet_cout);
, K4 M. t6 a0 m" Y4 r( P                count_copy = buf.packet_cout;
, t# H7 l9 f* B0 [1 M7 o# ?        }/ h! C1 k# g5 H4 P5 A3 b
        else9 k* R! u: W; ~, h+ E
        {7 S, ~7 {, Y* e' T& Q0 C
                printf("No effective message!");6 [( c% F0 O' K. e- o: k4 V7 V
        }
0 c& ~/ u2 I8 x( D2 Q  x4 ]4 A: W}! ?5 ]! k- @3 ~3 F; ?
. E' |* X8 C% H, U" D" w8 R! M
$ x2 G, K, w" q5 N, z+ y
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
3 w- U/ T- P- v使用下面代码,对内存使用了mmap函数后:
. V( S1 v7 \' s8 T5 X; W  Q#include <stdio.h>8 h2 [2 o; i! `) J* e
#include <unistd.h>
, O9 y# O0 C5 f0 z#include <sys/mman.h>1 o9 j& n  u5 H4 @
#include <sys/types.h>! c0 }; P" }) \; U9 Q0 y7 ?; Y- w# R9 m
#include <fcntl.h>
. R6 [3 ?0 t2 s4 k6 H" D8 P- z( O7 `  r8 Q( O9 c& Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)
, d! J. F, l- X) p' O#define SHAER_RAM_SIZE         (0x20000)   : p) F. o$ {- ?' u7 c
4 a: J: j: Q- o8 V# D
typedef struct+ n, y, ^  L) X$ E. S6 R
{
8 Q2 r5 _0 c7 U4 F0 f7 ~        unsigned int a;! \& U' K7 K3 X- T, D
        unsigned int b;
% f! V- T8 I4 t' E: W: i) r4 x! B        unsigned int packet_cout;
* v( _5 ?' x' E9 f}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;% _, W% E3 T& H- k' Y8 P( }4 O4 i

. i. J, g) h  b3 ]; b2 X/ ovoid read_MSG_buffer(int *baseaddr);
' x) I9 q9 G( Zunsigned int count_copy = 0;
1 X" o- |& f/ E8 ]5 c
% ]8 `4 D$ Y* V$ lint main()7 C" h$ g6 D$ U: V
{  C2 N: A4 r% O* A1 l; H& W. P
        int fd;
3 P" x6 y+ b, {7 e" g1 B        int *mem = NULL;
) T/ S) s; o' U4 N  P( e+ B6 ^2 h! R$ G$ b( L, l
        if((fd = open("/dev/mem", O_RDWR)) <0); P2 ]* O$ V: f% {5 f$ Q' n3 V
        {
2 G3 n2 H4 Y5 P& A9 q7 |6 f# ^5 I3 O                perror("open error");4 x% z! ]' ^# ?
                return -1;% q5 S# J  m* J7 P+ k, W
        }; j" v) a! J9 E  s
        
' V1 B: p5 X7 h3 T9 [* G/ y( f1 c        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
& M6 o' v7 o# F! h; z
! {5 K$ p* S2 D7 c" ~# ~& y0 w        while(1)
) ?7 ?  l* O& K8 {& H, s+ O        {2 `* e$ q1 i, Z# k; ?2 D) s/ \
                read_MSG_buffer(mem);9 H1 l& C7 B/ }6 O/ t+ ^) r
        }                * E2 W. Z& Z: _! z
}4 I' H( ?, ]' n
2 x8 z0 k% k/ `; T3 Q2 F
void read_MSG_buffer(int *baseaddr)
2 r; Q& {+ ^7 _; q# F2 Y  E{/ n( h3 O3 _  R. j* Q& {
        pRX_MSG_PROTOCOL pshreRAM = NULL;, p* B$ Q& t" D" }: J, J* Z3 p1 m

: f" I$ o# T5 r" ~& ~/ I        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
5 M: J# i2 j0 W1 \! l* {8 p8 L( }/ q" {+ F3 a2 S
        if(pshreRAM->packet_cout != count_copy)
, U; {& R, L4 \( Y/ I* n) l  \        {( T4 F5 |) L1 I+ [- D: Y
                printf("a is %d\n", pshreRAM->a);
* Y9 _  m& j. Y$ H7 ^                printf("b is %d\n", pshreRAM->b);8 I( F8 D& Q: ]: ^! E) v- S3 C
                printf("count is %d\n", pshreRAM->packet_cout);
! j' C' i8 a6 ^! y3 J0 F) \" u                count_copy = pshreRAM->packet_cout;3 M+ Z, p" S2 ~- Z/ H
        }
$ R9 D: j' ^7 ~' U% B; g        else
2 Z1 M5 }# K8 w6 x: z+ a0 B        {
! \, Q/ s) L% |& v" [                printf("No effective message!\n");+ q& K' N5 W. Z6 z& a
        }" J9 @6 ~" K/ s7 S
}
" ?4 m4 Z  j6 C) {0 a: O3 e4 @) O( H# Y1 p) i
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???  i6 ^7 `: v2 g- K* [

) S. L- j0 ]% u' A5 R4 e- q
* }* R- B; v8 }* A5 C) [7 z% O. u5 Y1 z) X

) G, J9 v# ~. Q$ R4 \: {% |
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-17 18:11 , Processed in 0.046239 second(s), 28 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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