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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
# g3 X# v2 Y" Y3 g/ J% k7 ]' K
) V# ~3 B. V3 s2 A# SOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
( I$ ~8 n  P% O2 e7 `. q0 |1 V4 k2 e#include <unistd.h>+ u( ^9 I! Q& T5 v% H
#include <sys/mman.h>
; h+ h- x) Y( u5 P! ^#include <sys/types.h>$ y  d3 L! P2 i) z& O& v
#include <fcntl.h>2 `  n( p& E5 G0 C& [% f0 p1 b4 A9 G

+ K: |6 N2 C2 G6 W0 _#define SHAER_RAM_BASE_ADDR    (0x80000000)   
9 z- n8 \/ _! ~4 D# d" [9 d, T/ U$ Y2 n4 {: _5 R* I6 s
typedef struct
- F' t% q; v/ p( x7 |, Z{1 g- V7 y& {2 n! c
        unsigned int a;: }  T9 c" ^* ~! h! t7 P5 ~
        unsigned int b;5 n8 i$ v7 I) p; ~
        unsigned int packet_cout;) c7 `. S. I7 q2 o. i8 r
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;- E% s; p. j4 }

' g" a, u' u2 L! o+ [+ k! Ivoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
8 @; @) e1 @: B- d  i" s& Xunsigned int count_copy = 0;' H  u" h+ y( @

) U& B8 a* Y0 O) G: F' ]4 [" a. R% p( n6 y+ }+ D  w, H
int main()
. S' ~( {  O. l{
( Y* a$ x6 X  a2 t  a7 W        pRX_MSG_PROTOCOL pshreRAM = NULL;
7 q2 p: a! y4 f& n        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;0 n% n9 |3 J" L% p

8 S3 j2 @  ?' X# y+ q        while(1)
  j, G5 D. n6 t; y) v        {
1 v5 t& l3 v0 ^3 e# ]. b. J! N                read_MSG_buffer(pshreRAM);
, r* K; N" Q$ z) A& H9 Y  M5 v! D        }                " ?* g5 w& m4 Z7 l
}3 D6 M: @2 x9 ~, v6 c% n
9 Y9 S- ]8 G" k0 G) v5 c0 x" B
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# c" R8 m; ^3 r* r  x{
2 S, P1 Z$ m* {  s  o2 _) u( K! R        RX_MSG_PROTOCOL buf;
/ d" ]! O5 r. h! D% k+ d' I8 f        
& G  {% ^1 E* }# O3 i        buf.a = pshreRAM->a;, r  z2 C0 R2 i) _8 Z* |
        buf.b = pshreRAM->b;$ r  Z# ^9 a, V" O* N4 @0 d
        buf.packet_cout = pshreRAM->packet_cout;& p* N; r) T5 K; f0 i
        & {7 J' b6 i1 x4 q5 i2 m) c
        if(buf.packet_cout != count_copy)
, c- ^( `* j' o# Z8 b% e$ c        {/ c1 N. k+ Y3 _2 ~9 H8 I
                printf("a is %d\n", buf.a);% g) b# h6 g* p
                printf("b is %d\n", buf.b);
: F0 P" Q! J$ d7 Z+ ?- N                printf("count is %d\n", buf.packet_cout);+ b5 d  i- c$ w# {  O  \) o
                count_copy = buf.packet_cout;
* @3 t2 C/ H2 e/ G        }" K0 h8 k! y$ J$ y) b
        else
& U, K% ?! K! T/ t& k+ \; W        {# n! b% P: h! \- q, s
                printf("No effective message!");) `' Y) }) m- ?5 z! W9 O
        }
  F! y' v& b: Z6 z, j/ ~}
% G: p: \6 V+ F! |/ @2 E" j. _2 R- m- o3 v& k

0 |& v3 v) u" Z; d1 l$ \但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。& r7 G. x3 ]& L1 D5 P
使用下面代码,对内存使用了mmap函数后:; o2 f6 s; p; i# _- p1 \6 c, c
#include <stdio.h>
3 h4 O! I  c6 p1 l6 |4 ?. _( v#include <unistd.h>3 \' Q2 _; u# ]( b
#include <sys/mman.h>6 G. ^- ~- V* s6 l4 N3 i% D
#include <sys/types.h>9 F4 D3 b- p6 a: A' Z+ \* T6 P
#include <fcntl.h>8 u- Y$ ?  d8 m% [/ }. N
. Z" J  p! c  f' _
#define SHAER_RAM_BASE_ADDR    (0x80000000)
- L8 ~6 X7 A) A9 Y#define SHAER_RAM_SIZE         (0x20000)   
) Z/ v: r2 ^, @) e& ?4 B. C; F' W( v: G/ f$ R2 N
typedef struct
; Y/ n9 g% \4 l4 |* V{( }- {* g+ u, B6 H5 |' k  O7 D. S9 Q
        unsigned int a;
( X, ]+ V6 O9 \  x6 ]' z8 ^        unsigned int b;
: g2 Q3 g' ^# E, v# W5 x) N( N        unsigned int packet_cout;
3 f' f$ u" I* d8 M# K6 t1 }1 C: ]}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;" K! ^1 M5 b3 z

( |+ D7 D4 {8 X( svoid read_MSG_buffer(int *baseaddr);
4 s" K4 i, a) e) s" f& dunsigned int count_copy = 0;
1 Q2 U7 P1 Y. E2 l# q7 P2 t# z5 G# E/ k, I1 Q" X5 J5 T  `) |: M/ V
int main(), v2 ^' E; n7 ^8 v
{
8 O" m! J1 Y$ [+ g0 U        int fd;, W" n8 u; r' b) g, M+ r: U6 \. U1 k3 B
        int *mem = NULL;: w% j9 I( [4 S2 q
% z5 G  k5 ?1 z$ c3 B
        if((fd = open("/dev/mem", O_RDWR)) <0)+ w/ T5 Z0 S" I- q$ W( t8 X3 v
        {
9 {1 l" W* J+ j' s                perror("open error");1 B* X; J- J- E  q* V
                return -1;
; F  X! G! x2 k; h        }
4 e, d4 s0 y1 J5 l% t$ o% ^; b        
6 `) O8 ~4 a/ z* |0 x7 f        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);! R. S) U5 {' p! m
. y- X$ }6 e! f2 U
        while(1)
/ ]4 m! R7 g7 K7 d! O9 f* l' g9 T        {
; b2 y# A- v6 X                read_MSG_buffer(mem);
& W7 r# |2 z3 }        }                ' q- K7 W/ ?+ b
}3 a" p. O+ [& h, {4 H. h( C
( r3 Q0 ?: H( k' ?  K) x# _5 B9 H
void read_MSG_buffer(int *baseaddr): v+ i! {4 O" W( d# a
{  J5 V: X0 G; A8 T2 I
        pRX_MSG_PROTOCOL pshreRAM = NULL;% |) z" o' K4 w- S5 r! i- s
! z" F9 `: B4 n' V
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;3 h, ~4 ?# k. S" ~6 P% H

  W5 c/ q( a1 D+ l% L8 X        if(pshreRAM->packet_cout != count_copy)
' p1 _/ p/ t8 ^+ d/ l        {
+ J# t/ J: w+ |                printf("a is %d\n", pshreRAM->a);! ]+ M3 J( a) k' K
                printf("b is %d\n", pshreRAM->b);0 N2 O8 b& p2 _% ~2 C/ U
                printf("count is %d\n", pshreRAM->packet_cout);
% k! Q; P2 k" M$ O% v) Q                count_copy = pshreRAM->packet_cout;+ |- U# l' D0 B7 ]* g/ H& g
        }
4 _/ @: F3 n4 W  W# C" p        else  z% B3 i4 P" j" `. _0 e" a
        {
9 U3 P) Q+ n* \% Q- D6 j( W2 ]                printf("No effective message!\n");
% B1 h- Q1 Q, B' O! K/ G, J5 p        }
, D+ q- g! }) Z}6 M& u9 |0 {5 a  J$ `0 Y
) ]' i( c- G2 V1 v
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
' o5 I. [( a) z6 d- @
9 D* {1 d! N1 v% d# q0 q7 V
/ [0 o- m. m$ w% M' o- ?; m7 s: Z% N

  O8 ~8 `& }/ S- q3 }
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-9 21:24 , Processed in 0.047512 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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