嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 " d8 K. M0 D' s2 I; a7 d. ?

& j0 s( [" D; d( w% BOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
- r( D: h: T5 y* q#include <unistd.h>
6 }4 ^( J2 T+ B4 C$ r4 ^- [#include <sys/mman.h>  j  g. P% c$ [$ L* G4 a
#include <sys/types.h>
8 M( Z. Q& k: l. D#include <fcntl.h>
8 W: k1 @+ k6 w5 l/ K2 S& O* M; Q
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; Z+ I: Q  X4 D, V
1 i/ D# \) a5 Gtypedef struct
' T$ U0 |8 Q4 R{
9 N4 l) U) F/ f4 h0 Z        unsigned int a;1 c( W5 T1 q6 c$ W& g: Z; I: C* {3 b
        unsigned int b;8 u/ B+ H: f8 r; b0 H
        unsigned int packet_cout;3 f$ i6 l( G3 a0 a
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;/ H6 _' F9 V4 I; I8 |

2 s# j! R- [& f# J) v- Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
4 w7 x- x% X' `0 }( H8 A) qunsigned int count_copy = 0;* Q" B* F4 r; j- Q

1 c$ s( y2 H  }" i( T- Z
# n! @* H, U( S! f* eint main()' `5 o* N8 {8 h: S2 j
{0 p6 q, m2 Q( @/ x
        pRX_MSG_PROTOCOL pshreRAM = NULL;4 M2 R8 v1 P! N5 b& a( I4 Z
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
; P7 k  {. f  r, M5 ]4 u) O! `3 T- \  J; W: @. \, {
        while(1)
- r/ s! [0 M; e% s* c$ M6 d+ Q        {+ O6 Q+ `, G' D& U- o
                read_MSG_buffer(pshreRAM);
# Q3 C1 q: x1 r' k0 v3 B        }               
/ W9 w* O" b( |: r  |}
  l0 K7 R' X% c. r" ^9 _$ d" I; c7 d9 o2 _# H% f
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)6 m; r$ l1 q5 j, U9 r
{! D+ }# n9 o" b! o7 D$ Y
        RX_MSG_PROTOCOL buf;
! E0 f- [3 r- x5 T! U        
( W2 d6 H" N! b        buf.a = pshreRAM->a;/ r. F0 H: S2 A+ U; S; `. S
        buf.b = pshreRAM->b;$ j2 a, |* S2 f) q0 i( v) m' ^
        buf.packet_cout = pshreRAM->packet_cout;4 p3 c1 G5 y( i0 _
        - q1 q$ d0 ^7 `' `
        if(buf.packet_cout != count_copy)
; X/ b' c" z. a. g        {
) k1 H/ s$ i# W/ b# x% C0 P& ?                printf("a is %d\n", buf.a);# L) g! D, Q" W
                printf("b is %d\n", buf.b);
# M& b; q4 p& j                printf("count is %d\n", buf.packet_cout);. y  ^6 H' E1 V
                count_copy = buf.packet_cout;
2 E/ S% x6 [+ R* e) V        }
* o: I5 z$ L6 ^$ A6 [        else6 V4 v" Y& j4 H
        {9 e' }5 k) p6 G& U: |2 \
                printf("No effective message!");
' V. h4 x# Q* a6 y. S        }
7 y' I+ V  u& o! Y' @2 V( k}4 v3 }; @( \" J* K+ m4 E0 R) [

! n+ v" }; o' w) f+ W- q9 P' m  x+ }( W& H: S
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。" a: W0 ?: S* k* a9 `
使用下面代码,对内存使用了mmap函数后:
% G: ~, V3 B  T" e#include <stdio.h>
3 j$ O2 U$ {% _2 R7 E#include <unistd.h>0 \+ P  P: s1 ?; @) t1 `
#include <sys/mman.h>
0 p) d2 F6 e' X#include <sys/types.h>
4 i3 J* e8 u) U4 Z$ F#include <fcntl.h>! W; g. W2 Q7 t; L9 E; ~) f- t, V$ S: {

$ K9 Z3 |  w: E  D* L#define SHAER_RAM_BASE_ADDR    (0x80000000)
% E+ r2 V% a0 Y% a/ G7 w$ U3 D#define SHAER_RAM_SIZE         (0x20000)   2 [5 J: r: O3 j" u' [, w

& E7 R4 ?' h: {% ktypedef struct3 ~0 N; ^! e- j
{1 @' r! q7 M& f* {1 w
        unsigned int a;
1 e5 c! X0 v$ A, l$ u        unsigned int b;
, w+ T! T% |' \% `8 ]8 m/ Y        unsigned int packet_cout;, H" ?! r2 S8 v) [. i0 [
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( Q" V5 }% P) v) e+ \

0 e4 Q, W0 r7 d5 D; A$ j3 a* vvoid read_MSG_buffer(int *baseaddr);
" ?, ~7 P; p" `- Q% z$ _unsigned int count_copy = 0;
+ f; M; s* U# o. w# W- Q
2 R+ g( B: K5 \8 a/ N8 Lint main()
+ F$ N+ Z& P8 T{1 v) H& l  s7 m
        int fd;- L6 n, n  |/ y! v
        int *mem = NULL;
4 M8 @4 T: t3 L! _
6 E! }  K9 n6 Q( K) \6 ^# i        if((fd = open("/dev/mem", O_RDWR)) <0)
; y2 m5 b/ y" F3 t* Y        {
* a! S5 `& j. r* |7 b4 K                perror("open error");
; _! o9 p! c* X8 E                return -1;
+ {: P/ v) S% f5 [        }
0 u$ R9 W7 _: h) O  `        ) C- O: O1 a- j& _$ l* h: }& I! W
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);  M3 g7 I4 K! P8 a2 F$ m
1 o5 W5 \. v+ G& S1 v+ d  G
        while(1)! w: \6 F( Z, P+ x3 l8 y3 x- N
        {
& E9 u, `/ U$ d" h* h  t                read_MSG_buffer(mem);
9 t$ Q8 x8 o3 d' f2 N9 u- O        }               
0 O/ O1 |$ V. P+ Z: }}1 ~* I# @3 F1 ^: ?0 O5 U
( Z3 S1 T5 o# [
void read_MSG_buffer(int *baseaddr)
9 \: X/ F2 j9 q) |9 h  _% H{' s$ [$ r" G. }# t
        pRX_MSG_PROTOCOL pshreRAM = NULL;
- p# ~) x; o4 h0 c$ M; b
/ X$ m- C; x4 R, W' k        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;8 q5 D/ N$ [% i
" z, X1 r9 n, k6 S$ L) j- T1 f* c- V/ h
        if(pshreRAM->packet_cout != count_copy)
: g, R1 F5 w. h1 u3 t& D        {+ S+ Q. Y& t3 V+ U
                printf("a is %d\n", pshreRAM->a);
& x/ q9 K3 a5 O                printf("b is %d\n", pshreRAM->b);
' ]% a$ A8 N* A% i                printf("count is %d\n", pshreRAM->packet_cout);
$ ^& j) r& ?' H! O8 _( r" E) d' U                count_copy = pshreRAM->packet_cout;
5 o% _1 Y% D8 _, F        }2 F% |1 \& }$ e: Y7 _
        else
6 w7 \9 R& s) \0 h7 n' M        {6 ?0 b2 ]& e/ ?5 }
                printf("No effective message!\n");5 L6 p5 ~4 C( ?" n+ j& f
        }
2 \" k) u% P8 E% w0 m  j) D8 L+ r}
8 O- s; u; Y9 {' o0 Q& Q+ g' }! P4 v; G; t8 C! g7 ^! K: N& o7 W
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
% q* j) Y+ O1 u
7 {; T. c6 M- |2 R- {( Z! j. L
7 O9 x# J2 T( q9 t& a& |1 [
3 Y* _- G' ]1 _6 W8 g  O4 B% Q& |8 Y  {3 f, q: k: Y





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