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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
  K: y. g4 B, e) K" A
% k4 v/ l6 g! |OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
+ v: n! s% q- ?  D3 D9 _#include <unistd.h>
1 L( f% C. |& z( E- Y, h3 u6 E#include <sys/mman.h>( P7 i3 j% }4 c- D+ L
#include <sys/types.h>
' L0 i4 f6 Q8 X- }6 w#include <fcntl.h>
7 T# L* V6 K* p* L  V- `1 |) }7 A6 ]
#define SHAER_RAM_BASE_ADDR    (0x80000000)   9 w/ A* X8 _, Z; b% _

% }. u, K. L3 u6 m, i* A* _/ xtypedef struct
/ _$ X/ o) y3 u( W) T- t( f3 D{
/ k1 i8 h1 K: e6 y        unsigned int a;
6 V' C7 A, v8 a( T0 g7 J        unsigned int b;. y6 s# P. X& Y: l, \
        unsigned int packet_cout;: X7 [- c; I( b
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;( R6 e& m& z1 t
: t: f. Y& @0 b: w
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
0 I" f2 u( H3 _( ~: K' hunsigned int count_copy = 0;1 l% C" ^/ U# c! v2 B# M
: I4 A0 K8 O5 a) D
; L5 M# p- p/ s# J& z
int main()% i- h% y- E  W; v% x% V4 j
{- ?# n# r4 }3 g( V- U; Y
        pRX_MSG_PROTOCOL pshreRAM = NULL;
, y# }& ]/ b& t8 n" E        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* W0 ?9 j% U5 q# J2 c0 F) h5 s; w* F# y2 i2 r
        while(1)% h- y, ?" @5 e* m0 |  d
        {
& y6 p2 l) [) b2 K% b                read_MSG_buffer(pshreRAM);' A( P7 _+ B0 \6 ]1 f6 k5 t
        }               
( r' Z1 p6 i% o# O0 m& G' k}. a% [; u# y3 `/ [
6 i, E+ O  i- ^- u  L8 y2 y
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
6 n9 L# w0 Q* U' F5 x{8 r# A! d* t& T3 x  s: V
        RX_MSG_PROTOCOL buf;8 J' A' [/ W" L' d" k
        
$ y$ K( E) H- `        buf.a = pshreRAM->a;/ x1 a! ^1 w0 w( c: s
        buf.b = pshreRAM->b;; ]+ R, v) E! D: @+ t) {
        buf.packet_cout = pshreRAM->packet_cout;( s6 T& `( `% ~6 m" `
        7 ]* n# D1 I! R8 v: x6 a; l
        if(buf.packet_cout != count_copy); L9 j& m) U9 z$ q6 {
        {! D; u9 U. R+ p! F9 I! m9 v
                printf("a is %d\n", buf.a);
1 E  k7 O+ [: k# s& X8 v$ }                printf("b is %d\n", buf.b);
) `" [1 e+ M; I; o) u6 f3 F                printf("count is %d\n", buf.packet_cout);
# C' Y+ a0 p! g; s                count_copy = buf.packet_cout;
% q2 M+ H+ k. A" m1 c" d2 ]        }7 h: R8 h0 E5 W5 H( c
        else0 Z! G3 k$ o  F, g4 a
        {
1 Z: N4 w4 X3 |! o) c3 {6 ]                printf("No effective message!");
+ H( ^. ~+ g5 R0 Z. D$ g        }: g/ M: o1 f+ z4 @  t1 Y6 @; X
}5 _( Q" c% s' U  v
+ @0 P" a- w% U* y2 \) b
, w( }5 U/ r+ i  V/ a  q0 D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" I0 I5 ?% z' r+ y) J使用下面代码,对内存使用了mmap函数后:7 G; @4 j* u& _' j' U  s4 g
#include <stdio.h>
) o) J% X$ I0 r; ?#include <unistd.h>* P( N/ E8 V8 W
#include <sys/mman.h>
& H4 G2 U1 Z! t0 p#include <sys/types.h>+ @  H/ {$ H" a  }9 D% K
#include <fcntl.h>" e2 L, j8 Q- b0 i/ T

; }! |/ q! h; T- z  ?#define SHAER_RAM_BASE_ADDR    (0x80000000)) S: w( B9 K2 F$ y9 j* d
#define SHAER_RAM_SIZE         (0x20000)   
# ~* k! F* _" J% S+ d
/ j6 G# _8 f: J1 Y9 Jtypedef struct8 L3 [, O" w, d5 U0 r
{
- I; @* q) s. h9 k7 G        unsigned int a;
" p! x; u' @0 A% a2 F) H# D$ W        unsigned int b;4 }) ?& ]) z, x! H
        unsigned int packet_cout;
5 l# s! ?' S5 b% _  x1 K$ Y0 N' @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# p6 i6 ^8 k% f4 e9 d% T

" `+ j, p( u$ M/ e2 q- ^( c9 yvoid read_MSG_buffer(int *baseaddr);
, `! z! T  d& J4 n. a; [unsigned int count_copy = 0;* P0 H* v8 Q2 z: n) y% V0 ^

4 X8 u& \; t/ x* F0 _* s" H7 F; gint main()
# L$ n, T8 E% ]# c' T{
! _/ R0 j! D* G( e8 L7 b        int fd;
0 a& f: {* H. F1 l8 h5 {* {6 v, Q        int *mem = NULL;
7 r2 H! {) @6 t6 g+ w) m* {5 j% v( I* e+ }" o8 R4 _
        if((fd = open("/dev/mem", O_RDWR)) <0)
" h: }8 H; b) @& Z1 n  E        {5 H2 _1 Y5 U6 Q5 Z2 Q. g
                perror("open error");2 X+ i0 E" t' V! j- b
                return -1;: {" R2 k% ~- y) r$ l2 m$ A
        }
5 x: h. E7 u% U7 J4 X. T        2 H; f$ w& Z' t3 k, E& K& D
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);8 |( p8 e9 K  ]  m- G0 y
. O% F0 R& f; \6 C( h% p9 |* Y
        while(1)
0 V1 @; p7 z5 N) x$ U- R5 h: {        {* q0 z. G) W  b! D- P
                read_MSG_buffer(mem);! j6 U* [" y( n9 Z6 x+ J
        }                : m+ Q7 s& c" Z3 a. m1 s" C
}
, V3 K* f+ ?- ^: S' S
+ K- `! e% {; s  h$ Uvoid read_MSG_buffer(int *baseaddr)8 r% G' o% `) h3 y- O
{
' [3 W2 ~* Z# T% @$ F4 E) ^        pRX_MSG_PROTOCOL pshreRAM = NULL;
* l# n- ~* x6 Y8 g9 o
( h$ r  @" r% d( P8 j3 p( Q: z        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;* \, o* d* G. {+ S

9 f0 \( I: K4 `3 _0 G( l        if(pshreRAM->packet_cout != count_copy)
3 B- u1 S+ ?, }2 p        {
+ o, j7 X) V' I0 T* T7 H                printf("a is %d\n", pshreRAM->a);
  u0 U3 c9 R+ q9 b7 a; z                printf("b is %d\n", pshreRAM->b);
6 m/ S+ s& g/ O. m3 f0 e  X9 t9 V                printf("count is %d\n", pshreRAM->packet_cout);0 |, ^1 }7 l6 O
                count_copy = pshreRAM->packet_cout;5 P$ q5 I2 ^" Y4 ?
        }
& f% q* k- }- S  t4 a        else& a7 E5 M) M0 D8 W
        {5 @/ \9 J9 Z0 O
                printf("No effective message!\n");) u8 H6 d/ c0 B. o# N- H
        }
7 Y( ]! S! k, Y) _' ~}( q9 J2 `* T& u' D7 \
8 L+ g. Z. P9 K! w  b  ]) I
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
$ b; d" ^: G; q9 O4 k5 E2 z
6 R. F6 W, a( }! s* H" Z
+ u* ]& u+ k' n( T/ I8 \" l) w1 A& v3 J- X0 x" {6 _

' M: ~) m# Y- f5 V+ c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-1 19:00 , Processed in 0.039282 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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