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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 7 O( f% z- q, ]8 i4 k  i5 j6 w# J, ~

: @4 Z' Y: m, B* ?! f3 H; COMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>, d2 _6 U! b% T) }
#include <unistd.h>
: J# r/ n1 J8 p) q8 s* s#include <sys/mman.h>
- Z/ s1 ~. Y2 P#include <sys/types.h>
9 ~3 H2 b2 o# |1 B#include <fcntl.h>
5 q7 K( a2 a* D2 D3 T8 ?* `1 Z5 P2 Z) r& v0 K  s
#define SHAER_RAM_BASE_ADDR    (0x80000000)   / Z0 m/ J: Z: G! ?* R0 n

4 X, n# U' K: \; Y- stypedef struct3 f. j% v1 {' K6 L
{
& m( v0 g- v1 a9 E2 o' }+ B        unsigned int a;5 C& T" |: @  w5 O8 L- ~; r! V
        unsigned int b;7 Y0 P0 u2 G# s" U; H$ t
        unsigned int packet_cout;
( m4 F( M9 r6 ^9 e+ t}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 ?' i( u% }+ O8 `3 R
2 `$ Y: c1 U2 W$ v' t1 q
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);* k% ^( i1 \3 L& _; {5 i
unsigned int count_copy = 0;# Z" O! r$ m+ {: z
, @' p# `' i! Q; y( q; J- _3 }/ n

; G# b- B6 ~' Xint main()
; H: ~8 i! Z1 {  A{
# H3 b' o% \, T5 H9 J) `        pRX_MSG_PROTOCOL pshreRAM = NULL;! T0 W1 J% ]8 h3 A
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;% F# D3 _/ I( Q) ~; {1 ~

$ j, a$ {4 r* {: {* P        while(1)/ s: ^# @: o! o: d8 a& P
        {8 a  q4 z5 a4 F
                read_MSG_buffer(pshreRAM);/ Y! w6 ?: {' ^8 P, h7 B7 H7 D
        }               
% G/ c8 ^4 o! X: @/ P* c) P}# a9 T- P9 m% \! B4 H
( G( Y% C) V# Z9 C
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% @1 }1 s% g4 l0 l* Y$ }7 H
{3 ?. ^& \' C- A# r
        RX_MSG_PROTOCOL buf;
" q+ V1 g* s! a$ v4 s        3 g: I- e8 n8 G. n- x) |1 e
        buf.a = pshreRAM->a;$ F9 m! j) }& E/ |. L
        buf.b = pshreRAM->b;
  \; w7 Z) p0 G5 X) y        buf.packet_cout = pshreRAM->packet_cout;* z6 d1 y" J8 a. T' ^
        % q# T- \: n: v* s# |! |. V
        if(buf.packet_cout != count_copy)
. {" `/ L1 ]9 F        {
% Y! R' Y$ G; ~! X! I2 _, j                printf("a is %d\n", buf.a);
1 J2 l2 e! x6 k( M2 |                printf("b is %d\n", buf.b);3 {  j7 Q- e8 l
                printf("count is %d\n", buf.packet_cout);
' Q/ _; D: }+ y% H. g                count_copy = buf.packet_cout;
$ O# x" u3 M6 e3 i6 V/ k        }8 [0 P5 p$ C% n& `! ~, Z
        else
; H5 G/ u0 f7 L3 C& j. m6 s        {1 ^. S$ i/ h0 Q$ C1 w7 {# |
                printf("No effective message!");1 Z/ w7 i1 Z5 _6 g3 D" K
        }
% V; v2 x1 f( W}
) H1 L3 D* o+ Y6 {
* J* _4 }% n. b" D$ S& L4 F0 i3 E) A: m( r) w/ W4 |: m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
1 R' c! o) S" Z2 ?+ N. [, Y6 y9 y, R使用下面代码,对内存使用了mmap函数后:  l! ^, c+ s. }9 [" E
#include <stdio.h>
' P! y7 e: K. U5 X#include <unistd.h>: n4 k: ~4 j" [  K  i
#include <sys/mman.h>/ p1 V4 Q  M$ h  n( i, E
#include <sys/types.h>
) D4 q. {9 s. c/ O#include <fcntl.h>( d7 u/ n. @' _  t1 G+ t

, g" H5 i7 O9 E1 d#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ M1 ?9 V: g: M* h4 Q#define SHAER_RAM_SIZE         (0x20000)   9 X  u6 y& p. n* e# I

" A% L/ x) R. u( i1 ?; i2 l( v$ ltypedef struct4 y5 \3 l5 s' B9 P5 i3 y/ S
{% @4 Q- q  G- f7 c3 ^- p
        unsigned int a;
9 R! i1 G# A5 ?# G3 r. T4 B        unsigned int b;+ v+ z: d) {( R, Z- b" P
        unsigned int packet_cout;
; U' T- {/ v% Z0 V}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
& J) T7 Y9 N6 @5 @; Q6 D# U+ `- S  ]1 I( l+ g' u; b
void read_MSG_buffer(int *baseaddr);' ~6 ~6 t7 o& v0 s' F; i
unsigned int count_copy = 0;; `2 H! Q1 i% c9 d8 s4 q
. \" ]+ y5 v' F5 c$ @2 J
int main()
  q( C- g% I) W% \/ F: m5 m. A9 g{
7 u/ J0 k) {! n+ ^4 S4 K0 q5 Y* @        int fd;
( k2 p0 B& j: ^, F        int *mem = NULL;' w$ u1 q* L, f
+ F. U2 u. U5 H- I' ]1 _' m
        if((fd = open("/dev/mem", O_RDWR)) <0)
9 ?4 w+ o1 S+ ?5 ?: p  I        {
( n$ k9 L+ a0 W# @% C                perror("open error");
; K2 X& i$ }2 y                return -1;9 R8 d0 `* S2 p$ ^
        }
* w3 h0 i+ a6 J/ F0 D+ n' x; o        
! G" Y7 c5 |3 m8 H0 e        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);% x& {" w5 z  p; y7 L! [8 P7 Z  Z

. u) i5 L4 b7 N0 @2 b. s; h        while(1)$ Q! A% x! i; C8 N- v# q0 c6 [/ @
        {4 J# v& E, m5 l7 V. S: D: k2 B
                read_MSG_buffer(mem);
. \7 K, O. @% ~& V        }               
' g, G8 S/ C0 ?. l}
8 t  |/ K  o9 F1 i6 ^2 P
. k# Z1 s8 |9 o" D4 F8 zvoid read_MSG_buffer(int *baseaddr)
) @, m, V8 a0 t- M$ B' t) z) i- e{
# n5 n% y4 r/ N& s/ h; L        pRX_MSG_PROTOCOL pshreRAM = NULL;
4 i) N4 u4 }, ]( _5 \7 M
$ {' I$ m% i5 }: A; C* o+ k        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;! n* [7 T2 H$ a- j. Q4 {9 c- X* c
8 N0 U/ g1 w) f; N+ v- j0 A
        if(pshreRAM->packet_cout != count_copy): w# [6 X& w1 F( N
        {: n; s# D: J. H. E2 S  J8 S+ x/ @4 B
                printf("a is %d\n", pshreRAM->a);
/ `# z; \; b, Q7 r: m" g. M4 L                printf("b is %d\n", pshreRAM->b);9 L: m7 [( F# w9 ?
                printf("count is %d\n", pshreRAM->packet_cout);& t7 ^. y0 b+ |: S; Q. R
                count_copy = pshreRAM->packet_cout;; b, r7 G* m9 G' \6 v" j( p' H* b- o
        }! t8 q  ?+ Q: R# d) G* V7 ~
        else
; i7 ?/ L/ Q! @/ H/ n% q6 @* _0 w        {, @% Q4 d4 S' \  V$ M: R( G2 P  |
                printf("No effective message!\n");2 r9 Y4 I' G; s! a; [! Q
        }
7 n( v. q$ c2 r! ?+ t1 V8 S+ o}
/ S( {2 Q% d6 \4 r0 U/ X) t* s2 U/ X+ t9 d8 X0 F+ c
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???9 d7 _$ P- [! S6 m& H$ J

# K% k$ e3 y  [0 B/ v/ r  s# o/ F8 _" q1 s9 o

. @+ w+ O  l0 t0 h
$ f. q! E; D0 U( Y0 {+ _  ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-16 04:54 , Processed in 0.040473 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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