嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 $ d9 r: X; `' }% H3 y0 d1 L- U

0 S; @/ @8 E: C, l; `7 |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ Z3 H  y0 Q+ ]! K& j# |#include <unistd.h># }0 y/ X; e* [/ w; W
#include <sys/mman.h>; @2 k! E# y6 z/ n/ M* j6 X5 `6 m
#include <sys/types.h>
, I) _) h1 J4 D5 b5 R#include <fcntl.h>5 W9 H; N1 _9 C- i# V
& u* h/ R% t$ v1 k  I
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
$ E8 [/ {1 }: @' C+ O/ N+ O1 `- [+ x( g5 z9 ~8 {
typedef struct
9 H) H7 H% T) X/ j1 b2 a& f* e{# j+ b& x5 A# J& [* \/ ^
        unsigned int a;' g( f" k* Z, V% h3 \0 w
        unsigned int b;/ q! Y* e4 u( F
        unsigned int packet_cout;" F& l" z( ]7 {5 m  U! Q* R
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& T. V* {# s1 J0 S. o9 n- W; W8 g, O' j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);1 ^+ L' k" j7 V1 ?
unsigned int count_copy = 0;  D0 @2 U+ @6 t6 B

; D: a0 P( u  L5 x5 Q1 D/ L" M! \! B* c2 o% M+ p$ S+ k
int main()
7 ?3 {1 ^6 I# J- N% Z{
* q, g. j% N. q% c; ]8 |8 Y' V        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 X% E9 j( d; D2 F5 M, i        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;( H; {: p8 H) K- O9 o
4 E4 G: j/ \" w/ r7 i8 V- }
        while(1)0 c# w. g1 n/ r- l( @' m: F
        {
8 Z1 ]% m+ A6 p( B! n                read_MSG_buffer(pshreRAM);+ d+ k% o  w  u3 M1 c
        }                  k8 o5 Q1 F2 l' L$ V5 T7 m
}
$ y# l% y8 k5 x& B7 s* G
" k; p) v! i. S! K" c& ^void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
8 t# c6 [6 G/ d{3 m/ e* |. Y5 f" P
        RX_MSG_PROTOCOL buf;# T3 h1 Z6 w, G% w3 j8 O* I
        ( j* O3 |4 W4 T. O* U! Y
        buf.a = pshreRAM->a;6 W6 h8 O$ n. p
        buf.b = pshreRAM->b;
3 b. N3 C4 z% x- d3 g        buf.packet_cout = pshreRAM->packet_cout;( `1 }/ S1 j* f' n, h6 T
        
. R2 l) t. s0 R# J. p& T        if(buf.packet_cout != count_copy)
: S3 L+ e* c/ x6 {) ^1 U$ ^; m        {
5 b! a5 Z, ]6 J8 f: M0 Q                printf("a is %d\n", buf.a);
1 g+ @. j6 U$ u; T+ H                printf("b is %d\n", buf.b);
0 N# m9 o2 h% l7 E  C                printf("count is %d\n", buf.packet_cout);, [6 B7 v6 q, r: S2 l/ f- h4 i
                count_copy = buf.packet_cout;& |/ m- o: B, r3 u* }" K9 \7 l
        }
1 p! o: y$ z; E9 s% B' g        else  d: ^( C6 F5 a4 m# A9 T
        {
, L9 c& V0 u+ Z* x2 d                printf("No effective message!");8 b" @: w  n) Q# i+ J
        }
: h' b7 T6 I  T8 b% N, |! ?  g7 W}8 _6 |/ I5 r2 c
) M, C# x. U. I
! P& ?3 p9 b6 P( R7 h+ a6 ~
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& O- b' j3 f( ]3 g- p/ G使用下面代码,对内存使用了mmap函数后:
; H, l  G6 C5 `( n) c! T/ X#include <stdio.h>
7 P; M( O) o4 W7 {1 \" W& Z#include <unistd.h>
" f+ i& y1 N" s! q; B! x8 {#include <sys/mman.h>
: o  P8 R( {6 N#include <sys/types.h>6 c; w, k5 Y$ t! l* D# y) P; i5 B5 T) t
#include <fcntl.h>3 Z6 I  r; ^0 i5 r
- g: @7 {, [1 A* @
#define SHAER_RAM_BASE_ADDR    (0x80000000)4 g; T& t0 \4 j
#define SHAER_RAM_SIZE         (0x20000)   
& f6 ~' R+ j9 l/ j6 T3 \+ E$ V- N- J1 J7 h: [7 J0 B. m! N
typedef struct
" \1 T. E# o4 m{6 ?4 ~6 M) g" \" C! g
        unsigned int a;" X* \) ~" I6 Z7 H  I4 C4 H4 x
        unsigned int b;
. c2 j0 l! y8 _% ?        unsigned int packet_cout;3 R8 t* h4 n5 u( ?* w
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;4 n! E% f& u7 K

7 H- {$ e2 i7 r# E9 L2 P; ~: {void read_MSG_buffer(int *baseaddr);. v5 L2 F/ B, C5 c! C( N% Z6 ~
unsigned int count_copy = 0;! f  D) @0 p# P2 W) I
) l* G; N8 |  M3 D7 Y, k1 Z
int main()
1 z  \& ?  a2 x{# n& v6 ~: A, t0 v8 w
        int fd;
! n: I! k9 a/ e* A$ q        int *mem = NULL;
2 }% @+ S/ w4 M. o% E$ Z( s
/ u/ K1 A4 o8 R  X7 w        if((fd = open("/dev/mem", O_RDWR)) <0)
5 f1 ^" G4 |, J6 S4 ?        {
6 @& |: t+ [  L                perror("open error");
" o7 d; \( c" X% K9 t5 i; a3 R                return -1;" d" L$ ?# g) o' }% t, K
        }- S! ?/ H6 r; M4 `" M! d
        ; q* O9 u5 k6 A- x
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ M1 ?4 H. N! `+ n

/ B, h' c7 D5 V! u3 p( T3 C/ S; r        while(1)
  G) ?! x. Y1 N' P        {
4 L" _; N' t7 f* T* T                read_MSG_buffer(mem);
' P" F& z1 r& F% q, G) `: _        }                1 h; x# f5 v' l# b; i) f
}0 X/ }+ O4 @: u2 P
1 r/ I+ I9 I$ v4 Z
void read_MSG_buffer(int *baseaddr)6 c" Q2 l( R  b1 y# u
{) `+ w* j+ ]/ o% w: o
        pRX_MSG_PROTOCOL pshreRAM = NULL;( s) e0 B& r  ?5 n6 H
" A2 V  I. A, C9 i6 e
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
7 Q/ L$ R2 i/ `; p& T$ g2 i0 u8 e
        if(pshreRAM->packet_cout != count_copy)( I6 v' ~! s8 m8 S" ]
        {
! \2 _9 m4 i, y' ^                printf("a is %d\n", pshreRAM->a);
8 [" k  u- c" g+ f7 K                printf("b is %d\n", pshreRAM->b);
3 {' `7 I- l1 {1 n% c                printf("count is %d\n", pshreRAM->packet_cout);9 q: |+ R+ p0 t$ u
                count_copy = pshreRAM->packet_cout;+ J5 V$ V3 j, n
        }, b- ^3 V+ e) @4 _1 T9 h4 W+ O
        else1 U, @3 V. P) N; C$ c
        {
) |% _9 F7 g$ M/ e+ m4 F4 c                printf("No effective message!\n");
$ Y- A$ W& N& h        }
- \1 o, ?9 t/ P4 f& d! ]5 U$ W8 W}5 E# e# B) C% c/ x
5 [1 M% ~  ^9 k  H
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???3 |, ~  A# `5 W  k' s6 u
$ z; L+ L% E- C" x; q/ O" b- \1 Y5 i

; A+ z6 s$ \; D6 B" ?' _  e( E  S  C4 k) N8 R5 Q; A

! q, a$ A. R. L9 E; J6 F+ j. j0 W$ g




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