嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 . Q' T: h0 q. k$ H" R, T$ {
- a* p* b, z  g, O- e& P1 D% Y
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
0 P4 W& r7 m) R% I#include <unistd.h>
! t; L3 U$ z4 F/ ]9 z#include <sys/mman.h>
: M& [) ~6 F7 h. R& g( Q; i#include <sys/types.h>, O, v2 {* D3 Q8 {. D8 @
#include <fcntl.h>
5 o/ H. R- L% v8 l) I1 Z
) Y" w' C6 p, V* z. y$ i0 q#define SHAER_RAM_BASE_ADDR    (0x80000000)   " r# }# G+ D, z

# D( y6 W% t5 t4 Z0 x' J6 @  _& \typedef struct; G$ M# J1 w( g5 Q( F
{
0 v& q* J- N7 R0 I& r        unsigned int a;
1 K0 C3 W; ]/ r0 D: w1 }        unsigned int b;# F/ x  S& N) A, g
        unsigned int packet_cout;" d; U; k+ m7 M! j; R# d. w& E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;! ^# W# `6 X9 a. _, d% \; c/ S
* ]3 G6 G+ X$ a: f" C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);5 Q  G; Z2 x6 D) |2 G
unsigned int count_copy = 0;) S  @2 g# t' @5 U- d! J; P
+ o; u5 K5 r/ I. @$ Y

0 ]0 L5 H/ q( y6 f. zint main()- e. I3 z+ p2 F' t- N
{
' E5 _5 E0 v0 Q2 ^+ Y8 _8 y3 O5 X        pRX_MSG_PROTOCOL pshreRAM = NULL;: _6 W* W3 ?8 a! ]' L9 C
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* G, `6 m$ l2 T6 A" w9 B: \- e
1 v) V6 H2 b# K        while(1)
3 r2 N2 X3 ]7 r; b- _' X        {
: C" J! w: J* C0 K                read_MSG_buffer(pshreRAM);9 _0 g" _4 s: Z8 T, ~
        }               
" }3 S' s% u" [}
( b8 @$ P& N$ f' H6 Y8 v. b1 D6 ^" Y1 f9 ^- m& [5 z
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)0 M, R/ [+ N' C/ `; p
{
- u* Q9 g% t. g" c        RX_MSG_PROTOCOL buf;
9 P; i) N( g7 R9 e5 |, A7 C          \, D" e& ~) f  H
        buf.a = pshreRAM->a;
% K1 ~8 g% o+ O& _' }* K+ C# Q        buf.b = pshreRAM->b;, z, X1 o) u# z3 Z
        buf.packet_cout = pshreRAM->packet_cout;% N5 q; I* m) |) F7 r7 {" J
        * z# `: u1 ?: X8 A
        if(buf.packet_cout != count_copy)! u. x4 d/ X# r1 X& N- I5 V% n
        {* E! Q' r$ ~; ~; d8 ]
                printf("a is %d\n", buf.a);
4 X8 n8 r; D% @1 P                printf("b is %d\n", buf.b);) A6 `8 z1 p# |8 N! u  r, _1 e: t& o6 Y
                printf("count is %d\n", buf.packet_cout);
  R" v" o6 O, x                count_copy = buf.packet_cout;
0 U& p" _$ t3 x" Z9 B" E1 u4 A+ `        }5 z8 X* c6 L& j. }
        else0 E, t1 Z% p8 T# _- N+ f% H
        {
/ n( K" p* M  j. T% O7 g3 Z                printf("No effective message!");
. B' z: Y3 a" M, N  K& i! S        }
# u# H* j' V0 ~) S3 ^: Z+ I}
& }& K; f. k" @! {
! }  x% l2 t: j/ V8 h6 q: [
' A# J; T" N3 n8 |5 f8 S0 z5 ]但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
& q7 N5 U) P" h; q使用下面代码,对内存使用了mmap函数后:# V, T- c' n- A3 i, `6 f: N
#include <stdio.h>, ?; E- B  V' v* M) E" e, \/ |3 K
#include <unistd.h>
$ ]3 a( \' G4 n#include <sys/mman.h>/ e& {% z# n0 G0 g0 K* q4 p+ k
#include <sys/types.h>9 h4 _& q. D; B. b$ w
#include <fcntl.h>
8 N* `# D8 e* m$ G8 E4 F
8 j  c: g1 ?% o0 x#define SHAER_RAM_BASE_ADDR    (0x80000000)
2 A) S5 T  K: W" `7 Y7 W; B3 {0 o#define SHAER_RAM_SIZE         (0x20000)   
2 Y- g1 y( ?( E- Q0 T# @4 e9 k' U1 i# T" G- W6 D0 s/ h
typedef struct0 }8 G, C, W) E8 Y/ _  Q$ u9 G
{
8 T, r& p1 q. y. g        unsigned int a;
1 N# d$ q# b  [        unsigned int b;
" ^  l) i5 b- N! S: [* O0 ^5 Y        unsigned int packet_cout;
: V  s* {' U+ k}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
9 @4 v$ r) ?) t* K3 S" U; \# v- B& j$ ?+ m2 W) U% z' Y! B
void read_MSG_buffer(int *baseaddr);
$ c) `8 G% |0 l- bunsigned int count_copy = 0;5 h+ O9 w  |5 v
3 E" {% X1 g1 u% Q/ U
int main()5 i: U  |$ s8 l# O3 v6 t! [
{
4 o+ S7 C* M0 t0 B6 n2 B$ w  R0 n        int fd;# c: c. Q' t; e( d5 D
        int *mem = NULL;) _& {: f/ H" f7 ^( G
8 _: \9 n  O/ y" K. N: O/ |9 Y
        if((fd = open("/dev/mem", O_RDWR)) <0)
! R8 V3 {5 {5 T: u, A        {# r$ ?9 F) c0 w; o) q5 ^+ E; [
                perror("open error");9 X6 M" Y9 B2 W3 C( z2 E8 M
                return -1;
- |9 Z2 Q; l/ k        }
. j) g' z7 L& E# T8 w        2 W: V3 q3 X  d
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);7 h! ?+ y" k' \6 f
6 }: s7 B; f4 {! M0 |) a
        while(1)- F1 n! U& j% b' L
        {: x4 T# w- ^+ E
                read_MSG_buffer(mem);" y2 G5 Y* F; D( ?$ t/ G3 A
        }                ' H' l  ?+ p5 Z# Y
}* ]. V/ K( U* s: k. L& F

- W: ~! @! n3 U+ Uvoid read_MSG_buffer(int *baseaddr)! U3 l$ k! U9 ~0 S) q
{
( Z$ A# N: Q# N9 B/ p+ s        pRX_MSG_PROTOCOL pshreRAM = NULL;* Q, O" q$ p  f

, Z9 Q+ \& ?1 B- Y        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;/ w2 f5 V( t% u7 T& {, i
3 U1 Z% h9 Q- t3 F
        if(pshreRAM->packet_cout != count_copy)( Q9 o9 J8 g' U; H9 k
        {! }2 ]6 U( I* e1 y$ b
                printf("a is %d\n", pshreRAM->a);9 H% T$ B0 n+ `5 a8 O
                printf("b is %d\n", pshreRAM->b);
6 N0 X6 t$ y- a& t$ |5 `6 M                printf("count is %d\n", pshreRAM->packet_cout);
2 a) K: ~1 c) P; m3 p) Y7 Q. c                count_copy = pshreRAM->packet_cout;1 k7 Y; q4 i: B" V  @
        }
1 d1 B! F8 [! ~2 N. y6 e0 [        else" }0 L, A6 M5 i+ l9 i7 g. q
        {  S' |$ F: r/ r9 t; m# f- M
                printf("No effective message!\n");1 t& q1 v# ~6 _; B- D' l
        }
# y3 x5 f- s) B}* o/ w/ h1 \( ]5 R3 e4 Q

1 n/ T: U1 X4 ?7 L: g0 ]没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ g) _# j1 M# E- X; d$ q7 U+ ?

% H. D$ ~; v8 M: |  h1 S. K  J. `0 g# B6 Z2 m
6 J+ F- w" h, x7 G2 C
+ a7 j* u# o4 a! u+ Y





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