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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 # g' S) x: ]8 I5 ?5 {
- n/ b. R' Q# `* n7 o8 k
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>) y& n) B' i+ m. J! H# |% F
#include <unistd.h>
+ Y# [1 @* H0 k+ i2 t* O. ~% P; \) j#include <sys/mman.h>
- l+ r8 l2 p$ g. ~; b0 b- J#include <sys/types.h>
* P$ y% @! v  l4 Z/ @* [" L9 K#include <fcntl.h># d3 H) W: t7 x) W. z" G
6 A3 M$ f: U2 v) o. S2 e
#define SHAER_RAM_BASE_ADDR    (0x80000000)   # a0 s0 P( h2 h# ]) y( ]6 e

% n/ Y# r- \* G' _# k/ b& qtypedef struct8 z! B) s+ L9 X0 Y" P8 E/ ]! C! @
{
- G% p4 u; o' i  L3 V        unsigned int a;4 ~# P- F; \/ c: a0 R
        unsigned int b;
# G: V6 i# i' y2 F5 r        unsigned int packet_cout;
! Q/ {' @2 y; b* t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" h( X, G+ Q) y

0 ^4 V, e. x: Q- ?1 Ovoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);9 q4 s* Z. K. Z! l0 Z. ]& N" u
unsigned int count_copy = 0;
. f8 x  w. I! ]2 P! V# s$ l
) x8 y/ v7 [) ?. s2 W  U2 Q& ?' I7 M. G5 y2 V1 v  w
int main()% E$ p9 S! `# a  H6 F+ p; R9 u3 h& }
{$ c9 N7 N' M1 A- F
        pRX_MSG_PROTOCOL pshreRAM = NULL;- h4 l: v! R" r( z# V
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
* N0 J$ M1 P  I' j0 P( V- X" O3 l" D( [$ z6 q4 O* _
        while(1)
. l& m, {+ S( M        {
. ]  j$ b( I1 {* `% K                read_MSG_buffer(pshreRAM);. L3 @( t2 G5 P6 f) F1 O" l- S' F
        }                * X# D# {& k) C- `+ ^* \# E
}
. D( @3 G! e/ f4 o5 u
+ d2 f; i7 b6 z5 W2 X: n- M4 dvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
: i3 a! ~$ x  m) V* ^{: i$ s5 O2 a+ y) P
        RX_MSG_PROTOCOL buf;
) F6 f7 G# _' t, Y; T- A7 V1 t        - y/ r( `0 I! h( `* r+ m/ R* G
        buf.a = pshreRAM->a;- r, n# `& p& [) K1 e& W+ s: S+ ?
        buf.b = pshreRAM->b;! L. B% l! O; B2 a
        buf.packet_cout = pshreRAM->packet_cout;$ i9 U: \* q, ?  f% @) y
        
0 \- O, r/ w3 ?4 R" I. g3 f        if(buf.packet_cout != count_copy)
+ R6 v8 C, r, g8 |4 W7 i0 M6 w        {$ B$ y  A) |: G5 U4 c1 e
                printf("a is %d\n", buf.a);
% V/ L* j. J: v' }$ N( }                printf("b is %d\n", buf.b);
; y9 O, x8 ?/ \8 u- t6 U% q                printf("count is %d\n", buf.packet_cout);
, n, \8 l4 X1 a  e9 Z1 d- X8 V, u                count_copy = buf.packet_cout;
! v4 L; }3 I6 H7 G4 t+ K" B        }+ h& a" ^& D( F3 E7 b( ~" M7 V; x
        else
. j# |8 ]# U/ J8 v) [5 y* E        {
, p+ r8 B/ c8 s( Q. u' H                printf("No effective message!");% ~  C% D9 _" p+ Z/ }& G' V
        }
% k) _( y& E8 j0 M  G# p, u" R8 B}
8 r* k$ m( H! m' t$ @! a, Q+ K% h. ?; Z2 ]6 ^3 ^, y
/ z% E6 G$ @7 a7 z& ~% f2 K
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
/ k( {7 N3 a. }' `* H4 Y使用下面代码,对内存使用了mmap函数后:
) I4 Y) U4 U4 N3 f3 ]% y#include <stdio.h>" d3 [; h" i1 P+ w; a* L) h
#include <unistd.h>3 ?2 f0 {% t1 y" Y, y' ~
#include <sys/mman.h>
6 E) ?  R! r6 T0 D2 c#include <sys/types.h>
9 N$ p. x* A; A/ \#include <fcntl.h>
/ }% @& T) W+ C* P3 |: h4 V6 M4 `! w
#define SHAER_RAM_BASE_ADDR    (0x80000000)
! z% k( E/ k8 A4 h#define SHAER_RAM_SIZE         (0x20000)   
4 t: r6 g0 A( E2 r& [
9 F2 T7 Z. ^% dtypedef struct
; G4 q3 x) M! f7 x{
+ C9 x6 F1 O- a: x        unsigned int a;
* L' U1 A& x9 m- R0 Q        unsigned int b;
) b3 e. w( c: R" p+ y        unsigned int packet_cout;8 A, T; s1 `1 B8 z
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;# Z5 Z8 M% n! r2 g+ H

1 i# l5 Q% J: G/ e; Xvoid read_MSG_buffer(int *baseaddr);
% m7 I; E  N( \2 R1 e7 E8 `; G% Aunsigned int count_copy = 0;
1 d2 q" m8 Y* x" I- Q1 B8 P6 n3 m) A) B. w! ?, v
int main()$ M7 H% p4 {$ y0 C
{1 g7 ^8 }4 R) S! R4 x8 ~
        int fd;
# _7 |7 _4 Y0 w9 q6 t' Q        int *mem = NULL;
4 h: g8 g4 i4 N" H+ o* ^+ R5 \# _; y; o& T' e* o8 t- o
        if((fd = open("/dev/mem", O_RDWR)) <0)) W" o; d1 ^8 ~/ Q# E' @/ C
        {
& c3 \; V# s* n! z$ n                perror("open error");. X( f* Y$ r8 b4 K8 t. K
                return -1;- v$ I" o' I5 E6 W
        }' E/ Y  G# K! @* @
        , q- x! @8 p! z6 F/ S" d
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
/ r( ^" j/ J. i) g
% |% W4 w  v2 l3 }1 P        while(1)
$ D" e' d" P) z/ |1 ]/ N        {
; Z* e/ v& @# J" ]5 B                read_MSG_buffer(mem);
9 T! y# ^" V& H7 W$ E$ X        }                6 w3 O3 K6 R( S6 {: f3 y7 `
}6 Q* U# t: R2 T

6 o' x" B: ^) u0 ]% G; I3 Xvoid read_MSG_buffer(int *baseaddr)" _4 }- z5 M; ]4 H! `
{4 {) E( {" @! I1 B: ^
        pRX_MSG_PROTOCOL pshreRAM = NULL;; Q1 Q9 d6 X( W$ d

4 Q7 |, B7 J: @, s( y2 g3 F5 L        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;9 R0 p/ G) I0 b4 `0 P

3 t/ C  @% z3 e6 R" d        if(pshreRAM->packet_cout != count_copy). u# D: T  F4 A$ c0 J+ @
        {5 _3 x% \8 K" Z: d
                printf("a is %d\n", pshreRAM->a);
! p5 m. }+ C% p+ F8 W' L/ l9 @7 K) x% l* t                printf("b is %d\n", pshreRAM->b);. \# L9 u4 J" o3 d9 S0 J4 u
                printf("count is %d\n", pshreRAM->packet_cout);: Y$ W1 y2 K) d; V
                count_copy = pshreRAM->packet_cout;5 i$ x( c: ^6 u
        }' t  D$ `$ S7 J- K' ]; F
        else. j) I! v; j# \: P5 Y. ~
        {: _1 d% c% q* s
                printf("No effective message!\n");
6 ^* c, Z6 {7 B( m- X* m8 g        }
  W4 U9 A# A, L3 w( U% _6 u}
4 g! }: B! V, u, S/ E
  e8 F: `! }8 A% V* b) H没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
3 }3 S: u( m. A# s) f3 Z
( k+ {, ?) E' {, A) ^  F) k3 C" o
! l# w4 \2 `; e1 \: ^
0 v% I- w; e' q) }% W& s/ A: P3 [6 f; p6 r: {9 M6 q! u' m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-15 09:31 , Processed in 0.038435 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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