嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
5 u7 _3 Q0 l8 v% q0 x' m/ B5 }
" F* s# O* I# qOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
; H( Z6 s  [3 Q; Y% B#include <unistd.h>
. J, e! W! ]. _#include <sys/mman.h>7 j4 G1 m; u: h& ?. M: ]# N2 X
#include <sys/types.h>
# H0 c4 _) d3 X. s0 Q4 S  e#include <fcntl.h>
0 C3 Q) \( E* D# \$ l+ R5 M1 U, n7 h, k( Z
#define SHAER_RAM_BASE_ADDR    (0x80000000)   ) }6 }! \) I4 J0 K+ n, ?, z

5 m; S' Y+ N  o3 _) Z0 Itypedef struct
  K2 O9 A1 ^. Z2 n{
1 ?6 B1 |  k! u' H        unsigned int a;* a5 D; f1 V. b
        unsigned int b;5 J7 c: S/ K# x% x1 |9 s6 k$ _" k0 @
        unsigned int packet_cout;" x  V4 c1 T% F
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;* R4 e6 }8 y4 k( g4 D8 B5 K

: d  {6 w' b" |( ^) R) W: Cvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);- v  c; J; h( l0 P1 e# p
unsigned int count_copy = 0;( F  @, F/ n! H" J
+ ^( X' f! n- C5 [! w# r

* ~( O0 P1 ?! g, eint main()% K. u( _' P! |7 ?8 B: X$ @
{1 V  Z- t, {' ^0 U8 y
        pRX_MSG_PROTOCOL pshreRAM = NULL;  `" \/ Q, U+ |2 P* y
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
5 Y7 N5 \5 q, z- c& i9 d9 I
9 Q$ d* f8 i1 y- O  l6 V        while(1)6 e$ R, K8 a! S8 Y2 B+ a0 ^0 L
        {6 f- Q- T1 H/ C" z7 V7 ^, y
                read_MSG_buffer(pshreRAM);
; s+ w! Y7 c* t2 P( t        }               
8 O) M# ?9 Q; t}4 G$ ~1 F6 n1 `' r/ b5 U

9 m* [. B2 L# q7 }2 ?void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)" A) W  m: ?* H2 H9 N+ O; W; |
{+ m. a5 r6 ^# W+ o- Y8 @
        RX_MSG_PROTOCOL buf;5 Z- _, E) b+ Q! s; g4 U
        
) P' P$ o  N7 k9 D5 b        buf.a = pshreRAM->a;& O. ?* Q: P  I; n* ^9 M1 C
        buf.b = pshreRAM->b;
* E% E- T: F1 h4 j, x+ e, M        buf.packet_cout = pshreRAM->packet_cout;
: H9 Z8 F$ t: p' c0 h0 ]        
) ?" _! q, G6 C8 ^! I        if(buf.packet_cout != count_copy)
! d% K4 c0 o( p7 _: X        {! r8 l3 c% P! F% ~. @8 r* x/ \
                printf("a is %d\n", buf.a);% P6 E6 x6 A: i2 f. ~- G
                printf("b is %d\n", buf.b);8 V& s1 ~( W4 }8 Q. i1 G; @& H
                printf("count is %d\n", buf.packet_cout);8 z4 |( k, d5 x7 p9 B  g9 J$ q
                count_copy = buf.packet_cout;
9 H3 w# w8 ]1 N6 o  a/ y        }
2 J7 `' F7 X7 y7 K        else( D: ~4 \  H6 N6 k
        {9 E6 `3 }# h8 w2 ]1 d0 F% x& O6 x
                printf("No effective message!");! F* Q; G! g( ]3 M5 n# m1 t+ `
        }0 g4 F% i; ~) ^' V) V3 h( I
}# r- X/ x, V( V( p9 u1 X$ O

. y' K# g" Q0 g, _9 N+ A
- Y9 g) |, z) X' d' K但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
' H) _# T& H( ^  z8 u  c- E使用下面代码,对内存使用了mmap函数后:" w/ }, }# m0 l  ^* n! ]! \6 t
#include <stdio.h>
; F/ b7 Q( |. V#include <unistd.h>
8 T& s  c4 n! C6 b- @6 `#include <sys/mman.h>2 t$ j+ `$ A; s" x3 i1 n
#include <sys/types.h>
% |; ~9 t. W# h- T7 H#include <fcntl.h>; q& [8 b9 h0 D% `4 ^) Z

4 Y( r3 Q+ u! h: Y#define SHAER_RAM_BASE_ADDR    (0x80000000)
; E. e* ^0 ^5 U$ L#define SHAER_RAM_SIZE         (0x20000)   1 m) I3 D. R) l* F5 u, Q( E
9 B$ I" _6 m' t7 Z
typedef struct! J# [4 u1 k* D: Q: s$ E3 q, d" o
{9 |* A( G' {; Y! u
        unsigned int a;
/ r* w9 v1 C1 \2 G& [( |        unsigned int b;
+ i3 a: X% M  [" @; N; b/ [        unsigned int packet_cout;
9 x* ], E9 k. J/ v}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;+ J, T2 f+ `5 \6 t$ c
- e$ f6 ~* I4 U
void read_MSG_buffer(int *baseaddr);: y$ I! v7 h2 T; p
unsigned int count_copy = 0;
; [# W7 A& e- R; R- K. u# k
" V4 {0 X' D5 B$ v" o9 eint main()# W0 [1 I% p* i( Q1 h, B
{
- ?3 X- U1 N$ z( ?% z        int fd;; |! ~3 i* i( ^; t6 v; _
        int *mem = NULL;; L% Q" G, I' A3 R7 k: g7 P
5 X9 U: I! p6 \/ _* Z3 A
        if((fd = open("/dev/mem", O_RDWR)) <0)# b2 r3 z; N8 \  V
        {
8 G. A0 T$ K% h7 o( J4 \! P$ W" q                perror("open error");
3 Q5 j2 C# ]# R' r  Z( o                return -1;# S9 |1 }# L/ e8 c% {. F
        }
2 v) J" j0 F  B3 H; U        
' @$ z, L1 P. m. @        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
' _0 _% x- Y" M" C* `( V( ?
' g/ x( W) O* T' d# m: J5 W        while(1)9 ]0 D8 V9 I, _
        {
( ?9 r7 u3 \$ \3 S! m: v                read_MSG_buffer(mem);2 z, E( s$ Q* p/ O; f% x, X: b
        }               
. x) e  c+ z& Q8 ~% E. g- i}
' f3 g1 }  u9 x: E" g9 t; S, k
. k' a$ K* S: K  M: zvoid read_MSG_buffer(int *baseaddr)
& r! D9 W9 ]* I: n{7 A( F* W2 i6 n4 K/ [2 [6 X) i
        pRX_MSG_PROTOCOL pshreRAM = NULL;9 ?. Z: e. f& `3 s# V- `  L# `
7 w4 v2 A- D! ]
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;2 `  K8 e7 o2 E* K8 y8 G) `  F- `. U
0 |* P# v2 }9 [; f- n8 Q2 u
        if(pshreRAM->packet_cout != count_copy)/ `0 F' m6 Y* x$ v5 N" O) s
        {
/ }4 H9 Y" U0 L4 Y, J, n9 C2 E% h( C* n+ P                printf("a is %d\n", pshreRAM->a);
; r+ Q9 E# b4 {2 x                printf("b is %d\n", pshreRAM->b);
) l, j: u! w5 }6 G$ t7 l                printf("count is %d\n", pshreRAM->packet_cout);# E5 K; \) g! a' [- n
                count_copy = pshreRAM->packet_cout;
3 O3 A7 L' y% u. A2 k9 a  B4 z        }9 K, B+ ?! w/ H5 Q; e, q# L4 h1 u
        else
6 r: j* r8 F; c* k" [% e. Z9 A        {
, b5 e, j9 r" Y% J                printf("No effective message!\n");
/ Z6 q/ _9 Y  w$ U+ g8 N! F( a        }
$ ?4 E  D% d- ^: \* ], M( Q1 v( _* S}  Q: P4 n* O2 Y+ B9 l! E

& h- ~) ^5 T/ N% Z8 _& ?2 x没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???) B7 f2 c  o6 e0 P8 g3 B
. h0 G% i! u' ?* \) [* Z1 j) F

% l0 q# Z7 Y0 ]! f$ j1 a  u# Y6 I' Z$ G5 s2 L/ }

$ e; l! H! Y( w, u




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