嵌入式开发者社区

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

作者: zc_fly    时间: 2014-8-19 16:38
标题: OMAPL138的内存映射是否在Linux下已经完成???
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
- x/ u- ~: w7 E1 F5 C1 W; E3 @
/ z& \! L9 H% ~* |' rOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>& v8 j! `+ O6 X0 l
#include <unistd.h>. Z9 a! ^/ j: n# t& h' w
#include <sys/mman.h>" r+ c9 u& q) b- H/ _+ P
#include <sys/types.h>" E' G9 X+ m$ d7 t' I$ q
#include <fcntl.h>
, f4 \9 O# C! m7 K* @6 c% l3 u. d2 O0 g' @% _% U1 N
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- A8 p5 I- F  t- o' f5 H: j* [: z. ^& [$ J9 U5 w* L; n7 z
typedef struct
- a$ f6 H+ u  H9 @2 n4 @& [{
5 t" T0 i0 h" P; i1 h) F4 B5 L, Q        unsigned int a;
0 k/ g; z8 u' r, F# D; N        unsigned int b;7 E& G. w& |. y. A1 ^* U0 U# V
        unsigned int packet_cout;
: J9 e; t& E$ T0 T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# V) q: \0 g0 x0 T

8 f8 }  j8 f$ `) h, i# \( z0 avoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 _1 {& Y0 H5 H8 Y& n9 V1 Dunsigned int count_copy = 0;' n! W' q% F7 B$ N4 F
$ B: H$ ^# _1 J; ?  W0 T

0 G  c# o! V, [9 A' w; ^  Lint main()7 [% W* O  f  U& i" X
{
1 |, h& L) e: Z        pRX_MSG_PROTOCOL pshreRAM = NULL;
; i5 E% P9 A/ i        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;) F0 W4 n; ]9 ?/ s6 p" l
; ?* W+ n. d  c, h+ E
        while(1)
7 i! U3 @6 i; v7 `. `        {
6 r% L2 _# T1 F$ K) n3 U, Z                read_MSG_buffer(pshreRAM);
8 h+ U2 d4 a; k, z! h) a8 ?  Y7 [        }                1 m" B0 R. Z* G8 F) C7 m
}7 X) o5 C* m% g

9 S2 \) t1 P; Kvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
- @6 r! Z3 f) N0 a/ H7 M{' s, F- r6 G; _& h9 k
        RX_MSG_PROTOCOL buf;
8 N( {' M# z- J: a$ K1 x        
% q' X& C6 P: s7 h        buf.a = pshreRAM->a;
/ g- i; R8 L, b, `        buf.b = pshreRAM->b;2 Q5 P7 a+ K; o$ e, N# J
        buf.packet_cout = pshreRAM->packet_cout;/ e! t! b" u* D8 @& U
        
  _) s$ E, [3 c  b8 ]        if(buf.packet_cout != count_copy)
$ t5 V) |1 N2 ?# f" D) k        {4 z. W/ p- C" x1 Z
                printf("a is %d\n", buf.a);
% a. d+ K- U0 j6 t5 v, E0 a0 ~* E/ y, V                printf("b is %d\n", buf.b);  ?6 l7 B. ^" I, P1 `/ y( M
                printf("count is %d\n", buf.packet_cout);" g# G+ P# p: P* O& h6 Q$ @
                count_copy = buf.packet_cout;
3 i( D! g, R9 g        }
. J& X  P/ x# M; r        else# ?: s' {, M& `+ Z( g1 J
        {
0 o! F3 K* `  Q+ O                printf("No effective message!");
+ H3 }3 R* o- r        }6 {2 V. ?& z+ ?
}
7 _) P! d( c: x& m! t
5 Y1 t2 k  u/ h1 c; h- h- d7 _5 d& Q8 r" `1 |. i; t! X
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
* i2 m. ]# c! y% x  m' W使用下面代码,对内存使用了mmap函数后:3 t4 i/ g9 o4 v  K
#include <stdio.h>% w$ z# |$ Z' H  G
#include <unistd.h>
8 A! s. ]6 b0 ~1 w4 N8 I#include <sys/mman.h>
0 l! l6 r$ O  N7 [' @#include <sys/types.h>3 U! D& j1 K: U, d) q4 O
#include <fcntl.h>$ D' ~0 F) t2 @# _. o
+ i/ ^4 g7 Q7 D, M" q3 o- w
#define SHAER_RAM_BASE_ADDR    (0x80000000)/ {* L! _8 v" [8 \* ^2 D
#define SHAER_RAM_SIZE         (0x20000)   , V3 `; f# {' Q) o
" P3 z9 s' T, o# {! n  o3 M' r
typedef struct
' F+ I, X" P) g2 c$ Y{
8 k" h3 f" t# g1 h4 j! F+ S2 |        unsigned int a;
! z' s" U' |0 \4 ]        unsigned int b;
" {- c0 k: O. p% V  T        unsigned int packet_cout;2 ^  g0 I; u3 P0 L! P
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
- k5 Q4 [# x. V! P  s. W; e% A+ }1 F. q
void read_MSG_buffer(int *baseaddr);
$ v% E- m' W9 V" ?unsigned int count_copy = 0;
' \, O+ j* E( ]# |6 e" o+ M* z! e* X, D) }- T4 M
int main()- G0 O% X8 s/ ~9 V4 _
{2 ]# M% y1 h: o5 N% t  C  O# d
        int fd;1 Z2 f, E5 }! G) W# b
        int *mem = NULL;
2 v( \* W( P2 n% t2 T4 V
0 L1 v" B, U$ V* F        if((fd = open("/dev/mem", O_RDWR)) <0)' R4 E/ g5 k% f9 @+ R
        {
2 Q& u: o& I  X                perror("open error");1 I9 F0 g) `/ I% M: u. t8 J! P
                return -1;  J9 ?9 Q* U$ L2 n5 ^4 ?2 ~
        }
( G. g# w' y* |. H1 d- s  L          ~, C: l" K0 m! F5 [
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ Q# r. v  U4 ~3 `

3 ]! o" \, O6 o7 _) |  a- _        while(1)
; Y1 e- e0 \4 ^: l+ z8 |        {
$ [2 A* F& Z0 O                read_MSG_buffer(mem);
; b7 [/ ~6 u2 j% u) P        }               
( X+ k( g4 F# `- P0 a}3 I/ }6 L( f7 U" p5 m0 p/ v2 R
" J) [# _: Q; X9 X4 X
void read_MSG_buffer(int *baseaddr)
& O& u+ ^3 M) s  j( z( w# g{: Q. z- W. [3 U. G" K
        pRX_MSG_PROTOCOL pshreRAM = NULL;
3 a8 ^7 h! @% L" k
+ R0 D9 h* @/ U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;1 H- K9 ]* h, L' D/ b; [( ^9 ^

5 t, [' D; [8 \        if(pshreRAM->packet_cout != count_copy)
' b0 K! w& M* S& o' P5 g4 s* X" G        {2 C* Y, S$ |- S
                printf("a is %d\n", pshreRAM->a);5 V+ `$ N6 Z& X" Y" `
                printf("b is %d\n", pshreRAM->b);) }3 J3 k+ Q9 S) K5 s$ {
                printf("count is %d\n", pshreRAM->packet_cout);
, g* D( S8 d7 {2 \* ?/ r8 b6 \. r                count_copy = pshreRAM->packet_cout;9 b5 a! t) p# R6 S8 w9 u4 G
        }
! ], f  Z; G" [0 Z        else
' A9 c) a& F8 E; D9 C        {6 I5 ]  B/ N/ H& S. s! {( `1 v0 ?
                printf("No effective message!\n");
2 C4 ?, u9 D. V1 S        }
  E' x. Z: @6 [3 F" C8 S}2 U) D; Y* z- M. O  t4 c
4 j) y# I. r0 \! {( S' W% {
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( w' i1 |+ c: U8 }8 A
# p. I" q. e7 o7 H4 {7 d+ _& X
( B% `7 [1 ^8 N: l. G
2 {5 B& z6 Y" s! a
$ G7 O9 {8 \6 ~




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