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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 4 l2 y4 Q9 `  B0 Z# t% a" R9 `
) b8 \) Y! y6 j; ?! Y$ L+ s
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>7 I9 e, i/ {- O& T+ t- `: V: B
#include <unistd.h>
/ Y$ H% O# g0 p* t#include <sys/mman.h>; m- f( v+ l; m
#include <sys/types.h>
6 e( [) V& s4 W$ S; W1 r#include <fcntl.h>
3 |: v4 ]* g9 s* M4 L) D: ]. U: g) W1 f
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ; W* G" X" q+ ^( A1 s( |5 t
7 l  i6 V; `& N0 ^0 m& V
typedef struct/ ~, w) w* }4 N* S, S; z) }9 {$ v5 X
{1 W  a9 ^  v" |/ P- _, S4 A) B9 k" _& v
        unsigned int a;/ q  i, Z1 |+ j, R0 v  _
        unsigned int b;
! e' t) I1 F0 z1 p6 O# m! B  _        unsigned int packet_cout;
4 t' u% H' n# ^7 K" j7 m}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) e8 q- j8 W' k

8 T# l! |- e! i* `% p2 e! Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
9 d4 [! }! I/ C1 C3 ]unsigned int count_copy = 0;
2 Q4 i! m9 D( f' R1 `, ^+ Y) I6 j. t3 W9 Z1 p

# B0 t: P/ u" n% }+ h3 |int main()1 H. @9 P' k& r
{& M: }' j3 P& u# m2 ?
        pRX_MSG_PROTOCOL pshreRAM = NULL;
+ N2 j1 e! I! y# f  N, j        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 S2 e# A9 X, C) F" H; \" v) }6 c9 `! d; G
& a7 {2 ^9 M" s# s4 O/ t& s        while(1)7 X* B- j7 D$ X# D. o7 m
        {
  I, g# Z8 h0 Y' R                read_MSG_buffer(pshreRAM);) n% _  e+ A  h. Q  L
        }               
: {5 J9 x4 p. q}
/ E* V5 Z+ s, D3 o/ ~9 E" m
+ a9 P, O& m: n) xvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
4 G& A4 P5 u5 S7 g1 t7 i/ u{: S- P: C$ y+ Z
        RX_MSG_PROTOCOL buf;
' r5 p- C6 G3 e( a        
; M4 G  a$ q8 e        buf.a = pshreRAM->a;# [: k" z  R9 S* c
        buf.b = pshreRAM->b;
' d* g0 U3 O: Y6 Y! ^8 ?        buf.packet_cout = pshreRAM->packet_cout;
0 j$ K/ M! \2 Q# v; \& J+ t1 {        
+ {5 w' n0 ^2 f! e: @        if(buf.packet_cout != count_copy)3 m3 q3 g& G7 L7 [9 E" v  U3 w% ~
        {
  ^( Y9 J. ~+ f8 x% r                printf("a is %d\n", buf.a);
" f. G1 U3 w6 o2 }! N                printf("b is %d\n", buf.b);" ^& @; P# g. u- v$ t, c
                printf("count is %d\n", buf.packet_cout);( p! t: h( l. g: N1 G
                count_copy = buf.packet_cout;
7 j3 c% w1 c, F) i        }$ L4 S  c, x( u& [7 [0 Z
        else
) |9 d% G' E& O  u7 m, v7 o3 V        {
: \. }9 \- q2 W3 v; {1 Z) W6 s+ c                printf("No effective message!");" n" T8 c" U- `$ {/ Z
        }
+ z1 P) E- l( G% c' o}/ O. O8 k/ ]3 W) _( h/ R! U

: o/ p; Q9 I8 s. w% y- r5 n* X& ~# ^0 \4 c
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' V8 ?' K+ \, K
使用下面代码,对内存使用了mmap函数后:
; a+ R" L1 B3 i3 N" f#include <stdio.h>" O: x1 @* j: [. U1 W
#include <unistd.h>
: `& i3 x# U# A9 ]1 m#include <sys/mman.h>2 I9 x% ?/ j; h6 J% @2 Z
#include <sys/types.h>
& l$ D/ [1 ^8 I! |0 c' d4 J3 P#include <fcntl.h>
% u! Q6 m+ M4 M: ?7 T6 U! X; |7 T# V
#define SHAER_RAM_BASE_ADDR    (0x80000000)0 \4 K; b0 a6 P7 X; f
#define SHAER_RAM_SIZE         (0x20000)   7 c8 \/ I2 `* {, C. f; A$ F
0 @% e" t0 V+ y4 V& [6 [1 @8 J
typedef struct
7 g2 Q" r5 a+ ]0 P{
0 R, _+ B1 L  |! L" A3 ^        unsigned int a;
1 P* Y$ q9 z& D        unsigned int b;( b( Q8 s2 n8 C1 n
        unsigned int packet_cout;5 f4 J" F3 }0 H2 I
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 k5 j# l* `$ Z9 D7 e( Y3 d0 S% }5 P
2 @4 o: G9 a0 a' f3 D& X$ R- O" V
void read_MSG_buffer(int *baseaddr);0 d3 p9 g6 b) t6 O1 S5 e
unsigned int count_copy = 0;- P, {0 J! E. H& N& X' E  q

' \% B9 n) }& b8 hint main()% }- z* n  H  ?0 u4 k& e5 b* O
{: _4 U  a+ M) k2 V0 k: N, i+ X. s
        int fd;2 Q# A! u6 t4 r' q# L/ G
        int *mem = NULL;
0 z5 i3 F6 L/ T4 o6 i) P
# [2 @2 d9 M/ A        if((fd = open("/dev/mem", O_RDWR)) <0)$ {7 ?4 X8 ?  y( x
        {! d4 R$ D! B" F: h% z
                perror("open error");
  @+ y6 X) f0 U5 g                return -1;
2 i3 o- l& K. b8 A6 I" D" Q        }+ ~) g5 d1 O) ~- q. n- U# u4 v2 I
        
! ~0 Z; W0 [" z9 f        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);2 l+ J, {% m9 @4 P( ]

! O5 A! V! G0 i        while(1)
+ d/ m& F7 @8 E+ N        {" C" H+ i& j! k. l% Z) @3 Z* ~0 Z
                read_MSG_buffer(mem);" L+ i4 p" ~3 N/ O' k
        }                5 t' e6 y3 f7 k6 C- K
}* y, Z  C  M) Y4 _

) p, \/ [, q1 \) Z' ]void read_MSG_buffer(int *baseaddr), L7 S7 O1 |1 v5 L& s5 X
{5 C2 P0 J0 L4 _9 s5 S
        pRX_MSG_PROTOCOL pshreRAM = NULL;
% j8 u5 Q: _. ~9 d* F- [% n9 Q5 Q- p" N/ `; {- V# |, l
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
' H6 \# H, x8 b; |& J( ]
& j' g7 N* g$ M9 c5 I- u6 W        if(pshreRAM->packet_cout != count_copy); P2 E7 s) `; E' i  @- ?
        {" i) h! |& }/ g) d
                printf("a is %d\n", pshreRAM->a);, \4 D! Z4 r* ]9 r, x! [) h
                printf("b is %d\n", pshreRAM->b);
2 i" l+ [  c# u: D9 L                printf("count is %d\n", pshreRAM->packet_cout);% X& m2 B2 e0 Z- ]
                count_copy = pshreRAM->packet_cout;
, o$ E& b$ }( Y8 o% b% b# c! h        }
/ b4 N' V3 S! D9 {, {) A        else
+ O6 a" T+ n3 q9 b/ l1 J; V& y        {
' L1 `5 }* t9 B5 S                printf("No effective message!\n");& Y# K2 N/ }! n6 w" A
        }
  s( g& b# P* e  O  C}
9 X" l2 ~" V, C( w5 t6 j/ X+ v3 D3 d8 M) ?* L
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
) Q5 B; t. W2 {. b- O6 V1 b7 Y- d
) y) V7 P) d& M' W1 T4 H. _

4 W1 C9 r6 c: S0 ]8 u) }3 K6 e! O$ }0 P& z& V: `
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-3 12:03 , Processed in 0.039987 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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