OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
1 }% r2 D0 D; i3 o/ h) }  Y: A' y5 A" H
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
) Z; G: ]. v$ C8 Q1 [( B#include <unistd.h>
. M* _7 d) B" E9 |8 o- a#include <sys/mman.h>
4 e2 o# Z$ X( ?( d#include <sys/types.h>
* E3 r! ~- H9 R2 S#include <fcntl.h>
5 }( f' G; ^$ C/ b
; u0 F  n3 p: \#define SHAER_RAM_BASE_ADDR    (0x80000000)   
( p% N9 J8 [' P$ R
7 o; S% q* w  P- G% d% J/ vtypedef struct
& [  O9 G: f7 u( W6 K" A{, k7 q9 M5 M$ \9 k6 c
        unsigned int a;7 {4 ^" b" _9 f0 f
        unsigned int b;# b/ H7 T0 j' n, x& `* p5 {3 E. U
        unsigned int packet_cout;8 \% |5 Y$ B1 L
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
# t0 f" F+ @( |: i! ~+ b# I" u% q; Q& `& E9 L
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
* s# G! U$ q+ p$ z( Sunsigned int count_copy = 0;, `, s/ E  y; `& c
- ]4 o& V- v3 j8 |* i5 W

* D, q  i* g4 f; Y# C4 N6 ~int main()
- Z) c; M" g$ Y! o7 p4 k* J1 o{$ F7 W3 w2 A# d3 T% n& ~
        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ P& s2 P% g! `) ~) m% k; X  _        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;! N, }# `: A5 w- B- x
) p9 c( \/ a9 S8 o
        while(1)' @; a" E& n% W8 r( c5 e
        {
8 f4 Q4 i* a6 t8 D% g) L9 v                read_MSG_buffer(pshreRAM);
) R9 S$ D$ y; A% k% O- U        }                ; j* [" @$ m" q" x
}! {2 H. h* Y0 C
& Z- v4 u$ B( Q  N6 @1 x
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)3 N. _: i- Q) y0 C' I# ]/ g& `5 r
{: U+ {1 e* n+ w/ N+ s# \
        RX_MSG_PROTOCOL buf;" f3 z0 m, P; A
        
: u8 z: I$ W2 Y' N; z; y3 u8 p        buf.a = pshreRAM->a;9 D- u3 ]0 J" S) }
        buf.b = pshreRAM->b;7 v1 j1 k, B$ h1 |) z( p; m4 S4 B
        buf.packet_cout = pshreRAM->packet_cout;, m( f* O8 m) y' r4 J- ?3 a6 Y
        % ^7 j! B" T. R. D- Z; X! {' w# u
        if(buf.packet_cout != count_copy)* C& o- n3 C( l7 s/ Y: @: L+ {/ m
        {- c" \/ n5 ?3 x5 `
                printf("a is %d\n", buf.a);7 I1 v2 V% y% J& n
                printf("b is %d\n", buf.b);
1 V. |  S" i% S  v$ W0 N                printf("count is %d\n", buf.packet_cout);  n, a8 x+ P0 `$ N+ r$ w
                count_copy = buf.packet_cout;
0 R0 z4 @# A: O! O" C2 l0 `        }
; H3 Y$ ?8 W+ S& ]! j6 i        else  r9 e2 s* g# ]
        {1 S8 h: S+ D1 g- u) B# {2 k* o
                printf("No effective message!");
8 i) L; ?$ d; r, ~3 C" H        }7 r% w6 d* k/ O
}6 r! W7 q4 @0 p( O2 K# f7 h. ^
8 w( U7 P$ a: c  I# T$ r6 R% z
! G$ g# i4 R% |
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。! {* A9 j$ Q& Y" l$ s2 J( z, w
使用下面代码,对内存使用了mmap函数后:2 u" u1 x3 @0 ]& D* O& I+ ]
#include <stdio.h>/ k; b: d  N7 ?/ ~( X9 V7 Y
#include <unistd.h>( z8 u% I4 X6 c* y) K$ N/ E
#include <sys/mman.h>
, y* e+ w+ T% y3 M; g/ x#include <sys/types.h>5 v1 n. {' }/ A+ C8 M% k4 T" P
#include <fcntl.h>
! B# U- q: ?& o% T0 L. ~
' P" a6 c5 ]( {% V8 p$ k#define SHAER_RAM_BASE_ADDR    (0x80000000)) b* r2 |( ~9 M/ I8 J& R
#define SHAER_RAM_SIZE         (0x20000)   
" W9 I% H' [" y7 N) d8 |$ [  C! X1 N. m) t
typedef struct
" R# [2 ^1 n! I" ~{
% `6 `' X% m0 n; Z4 [        unsigned int a;  c9 `/ p! d% [+ n( ]4 u, E1 z  X
        unsigned int b;* e, f% W/ P0 M% g
        unsigned int packet_cout;% I3 r, t, M, ~
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ A; i# V& x+ g* v3 d( u  }* X2 L+ C; a$ V* a( m7 P* a
void read_MSG_buffer(int *baseaddr);
. S: D* A+ Y9 p9 @unsigned int count_copy = 0;- k, e& W6 O9 K" ^( C! \( r

: d! X! b; B+ Tint main()
3 @- W  H& i3 o2 i& ]% A! h{% ?: z% o2 V4 }8 k( x
        int fd;
# {, J, o% b& M, T4 w        int *mem = NULL;. n( r  D" C. k& Q6 e

4 Z; `' d  I. |" F: ~5 f        if((fd = open("/dev/mem", O_RDWR)) <0)
9 n/ @+ X* p1 N  m7 W4 \4 H        {+ I: X9 Q" s' _4 ~9 q
                perror("open error");& d$ S7 b  V7 ~; S
                return -1;! C2 ?7 V& }2 d% z
        }
+ X7 K0 x7 p* z7 L9 V        5 Y$ [4 Y" c3 l6 W" D0 M9 o
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);( D6 m3 y; n1 \- m6 w6 E

; P* b5 ?- S, J2 H        while(1). Q6 {2 n* p9 S, Q* H# a0 d
        {
7 o( r1 K/ q! E0 b                read_MSG_buffer(mem);
3 G/ T4 S+ u" S3 }8 o9 W. b        }               
9 G& H, N3 r: p4 n. t}
  m2 @: V* H2 G0 M$ R4 N/ P6 ?! U: a" n# `* M- P( [7 m
void read_MSG_buffer(int *baseaddr)1 x3 {7 E: I  s) @& M3 r% s! I
{1 i  a) t3 Y1 x# h) z
        pRX_MSG_PROTOCOL pshreRAM = NULL;
0 e' x/ Y/ e. P4 M  C- t1 x+ f
5 n) A+ I) ~+ U        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
0 t8 Z  O1 b. }& p9 d0 H+ g- n/ Y
% I/ m7 \: Q3 ]$ h, b" b  k+ }) N        if(pshreRAM->packet_cout != count_copy). @8 d( J: t% h7 T+ p) T7 ~
        {, L8 H( }4 z: \0 X! ~
                printf("a is %d\n", pshreRAM->a);
) b# R* g& G8 Q& T2 V) ?' V! t! S                printf("b is %d\n", pshreRAM->b);
* E& q9 p' r  {0 \+ o                printf("count is %d\n", pshreRAM->packet_cout);
/ |; A& U& F& A                count_copy = pshreRAM->packet_cout;
  x0 b1 r3 `: O* Z8 c, c        }% R% a2 V3 T8 v0 v) q8 m# M
        else' K" U  |" j. c" A) u
        {
+ b! [* I2 ~4 I$ y                printf("No effective message!\n");
; P- {% g0 {( h        }9 _& }, ?, }. q/ B
}
* O2 V) d2 j: k! b  a- `2 _6 o* _$ Y2 n6 l3 j" a
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
( R7 e' g: e/ L2 x* f7 q, J- Y+ I8 q; F1 E9 @9 f) C
6 {( X4 D6 f/ r& x0 t

: |9 h+ O# N5 M5 E+ v! u' Q  g) n& y  O
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-2-7 11:00 , Processed in 0.040224 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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