嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 ! B$ s! j$ ?( A
+ {" i# w' g2 i/ {
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
/ }5 q8 x5 w; h! F#include <unistd.h>2 H1 G+ H, M. j9 Z. b0 p' E3 `
#include <sys/mman.h>
/ z  R* `  M- W#include <sys/types.h>! L! C' a7 r. S* p2 n! e
#include <fcntl.h>
! I0 h- n( ?+ F9 A) w( }' ~- M# r: C! R
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
. V  \- ]/ ^& U# x' K/ e% \, C/ N3 V) X2 }+ u
typedef struct
3 Z" R$ f) q8 q! E/ M! U" B0 Q{6 A. x- `2 L' m* t( [
        unsigned int a;
& G3 L7 `% F' N* p        unsigned int b;9 R3 w2 y& q* L% L
        unsigned int packet_cout;0 _9 C* s! M/ H
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;. W& Z) ?4 H  N3 [  u7 N
) m6 d' c; K5 `7 b
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);" P1 N5 G  R6 B5 J$ S3 ~
unsigned int count_copy = 0;6 ?; [$ l5 g- ?( H# r! ^
* S  m) N4 H" S0 w7 ^

6 N: X/ @* P+ B% O- s  Kint main()4 F# l! v# H% w$ K, ^) E5 n
{3 n7 w3 n  `9 @  _" _* S5 t
        pRX_MSG_PROTOCOL pshreRAM = NULL;8 [2 F8 f: t. L. a7 y+ n* s9 m  w
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
9 M( n. Q; m% Y6 W8 l1 o7 Q2 u& F
        while(1)
2 v. `5 E* G6 }  [        {6 j* ^* d/ W7 v+ q- c; e: ]
                read_MSG_buffer(pshreRAM);
2 @* G+ p! Q8 N4 V  u# M        }               
  G& O8 W6 c6 V% G) o+ D3 O}
+ Q( n3 S1 x( W! C& Z; z+ ]4 r# O0 Q" T0 c3 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)$ g& Y- W: H2 |
{
" z/ m# L3 u( _4 U+ Z        RX_MSG_PROTOCOL buf;
9 h$ t+ Z5 ^' x$ @        1 n: X2 g' x* b
        buf.a = pshreRAM->a;
% X2 ^3 j) @) d4 u( P6 {, ?9 S        buf.b = pshreRAM->b;
; \5 S! P* h8 {. D        buf.packet_cout = pshreRAM->packet_cout;
! g* I. A: g6 Z- ^* Q% P% v        
+ k$ i9 Y; W3 \, r        if(buf.packet_cout != count_copy)
* S  ^7 j! p' Q/ R% X- H* h- {6 n2 V        {
; J4 }5 H3 z$ a  f- I8 s5 r                printf("a is %d\n", buf.a);8 l+ }% r! p' r8 Z6 B) C. z
                printf("b is %d\n", buf.b);
4 O  l. b; ]+ W& L                printf("count is %d\n", buf.packet_cout);
6 q* h  e& f. ^5 e                count_copy = buf.packet_cout;
9 n% A0 g% a" x& A( d$ ~* X1 T        }
: ]1 d& Z3 ]0 Y  J! z        else8 L# S2 ~% \+ C1 p& ?+ B
        {
, V! e& l9 h3 j7 d                printf("No effective message!");; a* X$ P( W6 i6 i/ v
        }
4 m! `3 j- s7 @' L* P}
# N5 h) G! x& G, h
; W: z9 w4 @+ P9 X" s
" ~& J, G; [2 z6 R但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
; K; h( t3 \: D" I7 ]使用下面代码,对内存使用了mmap函数后:2 [  Z' v5 _" D  Z* i
#include <stdio.h>
4 O5 t* X2 b( o; ]7 \" f5 X) {: `#include <unistd.h>. F' r5 X6 x7 F/ P- C" r
#include <sys/mman.h>
, O. v! ]. Z, S: z  w* k" y# S#include <sys/types.h>
6 S% p, B& B3 g: A/ d) P#include <fcntl.h>2 p# ?" L  c! E$ g( ^: B' X$ }8 }

- W" t3 w$ K6 T/ _' B#define SHAER_RAM_BASE_ADDR    (0x80000000)/ ?# r( E# D( \
#define SHAER_RAM_SIZE         (0x20000)   ; B) @0 D) H1 T1 p7 @7 a

2 G4 ~$ ^+ g* c, v8 N% L( t* R$ vtypedef struct
* t" g- Z  o& H' K{
- e9 j  o$ v4 h# I4 j, l        unsigned int a;
. `# s" B% z' X9 d1 D) r        unsigned int b;( X3 Q* C3 C$ u' s+ q0 d
        unsigned int packet_cout;
7 H: h9 e' J% P2 Q2 O}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;& y0 O+ h! f% g% \$ }5 |
, [6 P4 g/ L  i! l' {1 {1 _4 d# @
void read_MSG_buffer(int *baseaddr);
! F9 j. p6 E7 {4 m( N! P: t$ Kunsigned int count_copy = 0;
1 z) S& L2 D/ t7 k5 `+ M7 O: I6 z2 c. P/ L0 A/ g( {, c
int main()
6 j6 S& ~$ B  a{
) l. F2 `7 ^7 D# J        int fd;
. l) R  a% C% K2 c* ~        int *mem = NULL;
) H9 j& G- X2 K
7 g" `0 M4 O% a( f, F6 r! g        if((fd = open("/dev/mem", O_RDWR)) <0)
# e! a6 t7 x4 L5 ]. I% ~5 r, K        {+ n* B! c+ H6 @+ ?% n
                perror("open error");
: v1 m% H( Z! c# v8 K' [6 [8 F2 e( U" r                return -1;
' ?" e* n) P" A- x3 Z        }
' J& e4 @% O- [) p. f/ M7 S8 |& K+ G        ' u5 ~' K8 j2 \2 r8 v$ l3 ^
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
4 E, f% |/ A  b' W2 @7 D$ j" }
% M: S* Z0 u; M        while(1)
& n3 n" D0 w: t' Z# x/ x        {
" L9 S: O+ l# @7 b  m4 C1 n9 ?; n                read_MSG_buffer(mem);
/ d6 p+ X  p, P2 B2 u' p" O        }               
0 Y, U+ }, w6 ]! c}& f; S9 D1 ~/ j8 C

- _" k2 L, ^7 Xvoid read_MSG_buffer(int *baseaddr)
+ Q* M5 M. A7 A/ O9 y3 u8 t{
* ~# E. `- \( [4 x4 W$ n        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 [* [, K( D2 H5 j7 U9 p( |0 `
8 Y9 ?) H8 n# t: |& o        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 M( x3 c% L( F' ^  i8 T  G9 C& o

9 n( r; I, ^7 D& w: A: U        if(pshreRAM->packet_cout != count_copy)
* V- R" [+ m2 u, t  B; Y        {! }$ x# ]1 n3 I
                printf("a is %d\n", pshreRAM->a);" p' l4 B& j1 z5 Z
                printf("b is %d\n", pshreRAM->b);2 J3 b! [  @9 J6 P, P4 K$ k
                printf("count is %d\n", pshreRAM->packet_cout);8 c# G. e( z3 f4 X
                count_copy = pshreRAM->packet_cout;9 s$ r; b& Q# f8 p2 s  P3 k4 `6 s
        }
& o; u4 M; \, x& E$ ~* D( ?        else
2 a- h- X$ k7 j7 \$ a1 e( A        {
: l8 b" [& w8 T. b* p                printf("No effective message!\n");
' H+ T" C) H3 t( D3 V        }0 r5 ?3 [: V0 [5 O/ r# y, {& @
}' k9 d. C/ d& `% a5 x
; B1 Q5 [( F2 ?& M  ?& g" ]
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
4 z8 _' ]& M4 m5 \0 e$ d
; F: S  {. U* N3 G
# W* M' Z) s- |3 i
6 @8 }6 f+ W( w
/ U" C: P: d2 Q+ ^& T0 R




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