OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 5440|回复: 0
打印 上一主题 下一主题

OMAPL138的内存映射是否在Linux下已经完成???

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; `/ j  N" q) `5 r) \1 H& k9 S+ ~, w% T
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>1 _, l* V) F" J- H% H& h
#include <unistd.h>
( x- v& ~1 A: C) [) Z4 T#include <sys/mman.h>6 a; y$ E5 X* h0 k$ ^$ r
#include <sys/types.h>6 k: K3 h, G/ d! P4 O' l
#include <fcntl.h>
) ?3 e& M) {3 ]& T
- x; Z& G: R1 D$ C/ W6 n#define SHAER_RAM_BASE_ADDR    (0x80000000)   
& n! p: `  S' y  x' f  b: V
+ O0 \1 c! }8 Ktypedef struct
5 L1 E) E/ _9 n8 m3 a4 U/ I{4 g7 H; F, Q( K( @" {5 U( x
        unsigned int a;! x/ w" s$ n0 V8 _. _; D5 c
        unsigned int b;
! F0 Q* R7 ~6 r        unsigned int packet_cout;& g$ L4 _. U' T: k; N; D: O  f  z; E
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;; C( F) ^" R: |1 s3 w
$ o9 T# V; S/ }( E2 ]
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 }) A4 w4 ^- W" p
unsigned int count_copy = 0;2 ]* p$ l8 m  J  v4 z5 v/ u
* W- Z( g% v+ f

4 Q5 X. l1 B% ~' y) cint main()
- I: r: X% r1 v- M, \( k{
. c) T4 e# X; v. _        pRX_MSG_PROTOCOL pshreRAM = NULL;6 i5 J1 c# g  t# Y5 t: i
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;3 E4 T$ L) q0 [6 v  q
9 A+ U# g, Z- M9 \3 [9 ^7 Q
        while(1)) Y5 M8 {4 \3 K" T: b$ Y
        {9 ]$ l0 |, }4 H! U' A
                read_MSG_buffer(pshreRAM);# {* L- L3 n% M( |& R
        }                8 \: ^8 \# o9 g: B% L+ y
}
! }$ F6 P7 m' l8 U7 W, s) s2 @
; {' [# e$ |1 R% X) Q/ X% O- evoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)7 A; n* _6 c  L. C4 I  T
{
4 c8 ~3 l* I' a5 B; c, p        RX_MSG_PROTOCOL buf;
! B% d& N3 T3 v1 s) x$ `) H        
1 e# `/ W* o, h) z        buf.a = pshreRAM->a;
' y9 u4 a/ w1 K$ v6 ~        buf.b = pshreRAM->b;
  C0 U9 C+ r1 o. |. a        buf.packet_cout = pshreRAM->packet_cout;
1 {& ?$ h* Y! b- U$ b: n        
" _- i- E, e$ t( T2 |% d        if(buf.packet_cout != count_copy)
$ x$ S' G3 K" N6 C( g        {( Y  H$ V; K& c, ~. @* s' Z
                printf("a is %d\n", buf.a);
) t9 l4 o% Q4 |; C                printf("b is %d\n", buf.b);: z- y* ?, ~6 t9 T" j4 w
                printf("count is %d\n", buf.packet_cout);
. Y( {, d9 r% W6 q                count_copy = buf.packet_cout;
6 H2 u8 [; z/ u3 x        }
! M5 P( h' H: O! s6 v4 B        else# h* r4 Y9 Q. Z( p
        {$ d. q, r. a5 j6 i1 c1 S3 q
                printf("No effective message!");
$ U! G. D6 x2 e* y+ ]1 _4 y$ M        }  ?2 V2 _3 B, z* o: \
}$ H5 Z( ^! \2 V' I, Y

1 W( h' P1 z% X9 X2 v# l/ U
) ^* H& I' @+ \5 R7 P2 A9 I但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。# Y9 c& x; v$ k  T& q8 T6 `
使用下面代码,对内存使用了mmap函数后:' B) B% q" j: S7 }0 D
#include <stdio.h>
4 @$ t! X  l# C0 n7 P/ F#include <unistd.h>2 C) r3 N: x% L& r* x
#include <sys/mman.h>
2 \& n. x! z8 n, E. `" T#include <sys/types.h>- O: K, h6 n  V6 \9 j3 C+ r
#include <fcntl.h>( r& C, e! Y& [- ~+ g
/ V& @. E. H; e/ G* ~, h9 m) D$ @
#define SHAER_RAM_BASE_ADDR    (0x80000000)
5 p% k% }3 q( D' D. q' @#define SHAER_RAM_SIZE         (0x20000)   ; ^. ~2 j# W4 R) ?3 y5 k
$ R" w8 G0 L) z+ U# j8 J3 k( L4 G& H% X
typedef struct
+ S! h" H) D* `! R4 U. Z  Q- e( D{
/ M8 b8 |+ {8 N) R" w  N* v- M        unsigned int a;, u8 O$ N$ v& X# D
        unsigned int b;
- d3 N( |  K5 i        unsigned int packet_cout;
  s' |( T5 }0 s1 |! j0 q* T}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
  D9 q1 Q0 @; s( h- B( k. \# W) R
, F, {- Z% @, X5 W5 F! bvoid read_MSG_buffer(int *baseaddr);6 B6 I, \7 r9 |+ k
unsigned int count_copy = 0;
% `# B6 i* N, Z, U' E- l. ^& x% I: X- H+ q1 ~
int main()3 B2 E6 }% N8 z! e+ W7 X5 I
{1 D& \. C- }+ _- O
        int fd;
+ [( g0 x- T% v- I        int *mem = NULL;* x. z2 y" s' g& J

# L! T0 h- s' q( G. ?7 \2 w        if((fd = open("/dev/mem", O_RDWR)) <0)! q- B8 Q1 ^& d
        {) z( X1 O6 e0 b* `8 w
                perror("open error");
. @6 t' p) C) D6 z                return -1;. W' r& N3 c! C7 h
        }
" H( T( U3 U; o4 z& n, I3 l- v        
7 W; n& ~1 o; V  i        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
) s5 V& ^7 {$ F, u& i
. k7 B) ^8 N* w  b/ R$ F4 E        while(1)
  @2 V' B: @* _0 S/ Z8 ]- J! L        {- c4 Q( M: }. V9 d6 ?5 H
                read_MSG_buffer(mem);& ]/ q3 j* ]& w0 O# p% u' O
        }                1 h4 C* i8 {- s' d+ ]7 }
}
0 U: ^( M5 d! ]) ^0 @, X9 e4 Q- E
9 a* l7 q/ {. K( h; C2 G* Wvoid read_MSG_buffer(int *baseaddr)
( a6 X7 X& g7 ?5 j; d) L{
  X& x2 c# y+ G: M8 ~1 E        pRX_MSG_PROTOCOL pshreRAM = NULL;
2 C) k% W" @8 o  i
) ^! Q3 @7 ~4 Q( M" B        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;+ k8 \) _' k- D* V, d' g# ?

; Y- O8 N1 y( p; [5 F* K        if(pshreRAM->packet_cout != count_copy)
3 n% W( b' z* T& u3 z* t        {
5 ]5 M  x( C* g                printf("a is %d\n", pshreRAM->a);
6 P& F4 o3 v& Q% D                printf("b is %d\n", pshreRAM->b);  C3 z' M5 c) ?& V. [- _
                printf("count is %d\n", pshreRAM->packet_cout);. p' f3 N( N6 p2 e* o& q3 |
                count_copy = pshreRAM->packet_cout;
# a9 b5 l' U' U# m0 o2 q  m        }* r, j" c" |) f% S9 `
        else
: e. L& M3 r6 T1 K' V2 t        {
  }2 }0 m1 R% ]                printf("No effective message!\n");. Y* G' |& p4 _0 J7 v
        }! a! M' m$ K) e2 H% |5 l1 S
}4 Z$ \1 _5 ~1 u) b7 q, k1 T

- E' |' \# u( q3 `没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???$ p) x" \8 D. P! ^

; W  O- a+ F5 e3 p9 s$ q* p' A* h

2 \6 H% l) S5 b/ l% g* F  z, Y. D" n
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2026-1-12 16:18 , Processed in 0.040522 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表