嵌入式开发者社区

标题: OMAPL138的内存映射是否在Linux下已经完成??? [打印本页]

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- J* m- L( L# [+ E4 U% D; u- x& c# ?( f( _
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>" O3 ~( I: r: V7 z
#include <unistd.h>
' L+ d0 G) Z' ?5 ^#include <sys/mman.h>. r. _0 E: ?2 g: C/ {' o8 L( y! V
#include <sys/types.h>
( P" W0 x2 d2 C3 `#include <fcntl.h>
( }# c! G/ h: u, `& J1 ?! m3 K4 f0 N, j5 q! b. q* [
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
6 m7 c0 h' B1 X& r8 g5 ?, j& q5 f, e. o+ V* Y+ X7 G
typedef struct
+ g0 Z& d6 ~* e{
/ u+ m" b; E7 ]5 b. \6 U5 Z; k7 D        unsigned int a;
! _- e' x/ u- n+ O3 E+ l        unsigned int b;
( P4 ^. Z9 u8 j. ~! N' L        unsigned int packet_cout;
; G5 l6 t  G8 x& \}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 F% Q' r9 m2 ]5 o% Y
* S) m) t! u" K$ }4 X
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 W* E4 d4 E' m# A: B% qunsigned int count_copy = 0;
( y! l' m3 a2 K) A& f  e+ E+ d1 ^$ p  h" i, L

! y- ~0 {! ?8 `, V6 o' mint main()) H  c8 v- _' c& I
{
+ M9 w- W4 [3 b& [: E( V        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 N/ k: [& s6 s        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% j  T0 |1 N2 t7 y' |9 [

9 S0 }$ n* I! P% m        while(1)  [( [  V* z* S7 f; p" S
        {
( Z# X% \' ~1 m8 m. j                read_MSG_buffer(pshreRAM);
, k$ N3 x- t) L! g0 K        }                + W3 M/ {! K( q+ C9 R. G; s
}1 J! Z+ R# E& h; B! R; h" |

2 j% g+ l# R. Hvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! P; K5 ?2 _5 T2 y4 J
{2 Y$ c& n3 S  ?9 V+ L4 N; H
        RX_MSG_PROTOCOL buf;: `* s3 H3 R* Y+ S
        ! _/ m; k8 s# t) l+ S
        buf.a = pshreRAM->a;
0 Q, W' [! u9 r1 F        buf.b = pshreRAM->b;
3 r3 s5 R7 ^$ `1 q        buf.packet_cout = pshreRAM->packet_cout;# H0 `# O# q/ P
        
% A; Q- i0 L3 k4 `" {        if(buf.packet_cout != count_copy)5 z( I5 ?4 }* c9 F% u! ?
        {# H" b$ n0 g# U8 P
                printf("a is %d\n", buf.a);; E* d8 p7 r7 ~0 E- R9 u* P
                printf("b is %d\n", buf.b);
# f, C8 [' {5 C0 j                printf("count is %d\n", buf.packet_cout);% t4 P; o* E/ `' P7 p: {
                count_copy = buf.packet_cout;
) k9 _/ h2 |2 J        }% B- m4 K& G& j. O/ z+ y
        else
' m' t6 C5 y% l$ W! C        {. c# h6 d) J/ i' _2 X
                printf("No effective message!");
: M. e4 [0 a( M# y! s        }
/ c, U1 x" {* P' M! o; M}
+ y2 V- a! |4 H& l( F# ^* y; _; [- k: A/ G  J+ `1 M+ n5 F2 I
' ^2 `6 m( _1 K' j/ v
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* p+ n. {4 X1 Q7 i+ i使用下面代码,对内存使用了mmap函数后:
/ e! h0 L# E" R5 _8 C#include <stdio.h>
9 I$ Q4 W9 n: N: e/ ~#include <unistd.h>
) Y3 [0 v2 Y9 k6 l: ]#include <sys/mman.h>
! I  `6 z6 [, W$ ^( L  H#include <sys/types.h>
5 [& F7 ~( F) ]: t! i#include <fcntl.h>
' M" R; {5 c! k' o( v& j
- O" }: m3 n! X3 X#define SHAER_RAM_BASE_ADDR    (0x80000000)
3 Y  b. h; ]; m, c2 @  M#define SHAER_RAM_SIZE         (0x20000)   " \( a  e7 @4 V, _) g. b

: H- v4 t( m+ Xtypedef struct
. _- B& n7 N  Y. b& S4 a, e{; o/ R% M% ^/ g
        unsigned int a;
+ u' t' d' b! S8 {; l) [" {        unsigned int b;$ A0 x+ L  o- ]
        unsigned int packet_cout;
; U6 k9 {) \/ y0 i6 A( u}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
; D1 a: x5 ~8 `' ~; u* }: o" Z* ^: ~1 h7 b& p; R. `
void read_MSG_buffer(int *baseaddr);5 P% |1 }8 M5 F
unsigned int count_copy = 0;$ L6 Z: u3 y5 h( |) D6 Y

$ s! H. Q0 @& Z. E! {int main()% v9 j5 n  U/ l+ i! f& f
{
  V3 ~5 v: D+ f) `; u8 q+ y        int fd;# N+ \0 G1 p! ?$ k7 z0 Q* e: X$ Q
        int *mem = NULL;
& Z+ O) Z0 z% ^  a2 c7 W& R
3 q6 k4 E* R- w: n        if((fd = open("/dev/mem", O_RDWR)) <0)
9 n& X$ R' `1 [4 F4 B" A; S        {
0 i& B# s# L% d                perror("open error");
& J2 f7 o) q2 O( f                return -1;8 H( U7 @+ O/ o: ?  Y: q) E
        }- ?+ J' I' o$ @- ~/ r2 f* ~9 g
        
/ }( u& u. [  f; F/ Y        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ C" G0 X4 [- J; m; p) e/ X% ~2 y6 _  X: ~5 q: g# O6 i
        while(1)8 |$ u% V/ t0 }8 |
        {. e. O; |9 x9 O. d$ Y5 K+ x
                read_MSG_buffer(mem);7 d7 r7 K7 V9 H1 i) j& M
        }               
* ]! X/ _/ F/ t1 b# T- \; q; q/ u}# [5 \& [  w; _

: p; d9 [7 v& Vvoid read_MSG_buffer(int *baseaddr)
+ y6 A; F; s8 l8 q{
3 H6 e/ }& t. q, N' ]7 n* |        pRX_MSG_PROTOCOL pshreRAM = NULL;2 o4 C  g- R5 x* n5 p
9 v0 a/ a5 o# G! R. G( r
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 v5 ]. \7 k& m& c+ F

+ i5 R1 @6 A1 }" J6 j/ X2 k        if(pshreRAM->packet_cout != count_copy)$ Q8 K, g, h5 h4 G
        {
, G- F, X9 b+ a7 q: F# _2 ]: X                printf("a is %d\n", pshreRAM->a);
6 A) _& S" t! ^: U( j                printf("b is %d\n", pshreRAM->b);
4 @3 m6 x# r/ f3 ~- F                printf("count is %d\n", pshreRAM->packet_cout);
0 N& v, @: I' J0 `- c# [2 P# J/ Z' z                count_copy = pshreRAM->packet_cout;; }3 V0 J/ n# O7 D
        }
; Z2 v$ b7 w8 D4 X8 y8 \( u( o        else' a: K; c( B. r: `2 J9 W% g8 R
        {8 h3 |. Q# ]$ i# F* Z6 ~
                printf("No effective message!\n");
, N2 ^  y* [% H  b( Y& v        }
) t1 f, B5 f4 g% }* R5 \}& {9 G; K2 o0 d! }0 C

! [" s5 L+ {/ B! T" Q& _, K, d没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???6 Q  v2 x3 V. @% H7 O; _
# n6 }8 h% ^( X0 G. L

6 D1 F, i6 `3 b# N4 S2 A* z1 P# _1 @6 r  j

* @0 A/ Q& G9 H7 a




欢迎光临 嵌入式开发者社区 (https://51ele.net/) Powered by Discuz! X3.4