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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
; B9 ]0 Y* y: l* y4 A2 a% N# |- I
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
" ~8 _* f; s/ s* s1 O#include <unistd.h>1 O# M1 a6 ?6 H& u5 h5 m( H
#include <sys/mman.h>
# v5 z% r6 p1 q! s) g8 f#include <sys/types.h>
' k/ _  [9 s' f. a9 r3 S8 Q#include <fcntl.h>
2 [! M4 k  A  _: ^( H2 B; \9 ^& H; S3 C1 M" M3 e7 G0 c6 K: o
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
; D2 Y  v& \; q$ S1 a0 @( s) P5 J9 E5 b$ k6 f
1 X7 H! g7 ?) b! O# A0 y. etypedef struct
+ _* d: R; W* b" O4 L8 M{
" \; `! L7 u' E& m        unsigned int a;
5 }0 F* b7 H: [0 w3 x        unsigned int b;
  k1 _/ J8 H$ I8 q        unsigned int packet_cout;
0 D: e- |& U2 i$ @$ M; Q; e}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 B! k* t- ?" u( k% C

1 n4 x% D  z! Z" }0 y- jvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' J; J9 Z" x  ~/ Aunsigned int count_copy = 0;5 T  b# n( N; d: j) C) X5 G8 R
3 v  ^) M) W& k1 ], `2 F
/ V6 w& y& O: l: l) W
int main()
: s, n" q: z) o1 B{. V' S1 z; q1 B' G
        pRX_MSG_PROTOCOL pshreRAM = NULL;- _% G7 K8 d8 q" L$ K
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
/ g9 E* `. W5 u; J- Q) f
2 ?. Z; q0 A3 n1 y9 a8 m        while(1)
* H9 Y+ @- d# v        {
$ e: y+ W# G4 _% j                read_MSG_buffer(pshreRAM);
* x- t& P* ^( f7 y2 Q        }                + a: `, X( ?7 M( q
}; B5 U9 [3 \* k8 f  S8 C1 b
" Z$ `) V" l, b' X& E( E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
# c: W8 A# j8 j# k8 K{
2 S: U9 E, O7 W( n( x  X+ d        RX_MSG_PROTOCOL buf;
5 w  t" h$ A+ G& u/ w        9 y* O) \: \" E1 m! Q# \( K! Q
        buf.a = pshreRAM->a;
# ?! ~& j, k7 |        buf.b = pshreRAM->b;
% C- H5 G3 ~1 P/ L& Q/ M" m        buf.packet_cout = pshreRAM->packet_cout;  O. U: s' q. V8 k3 O0 p" A
        
' O  Z) @: Y# W3 E        if(buf.packet_cout != count_copy)
* m2 r2 f0 p: K0 G        {
) K% f/ c$ w; z$ @4 A1 Y                printf("a is %d\n", buf.a);+ T/ N* e  s1 B, r# s
                printf("b is %d\n", buf.b);
' m! _+ [4 y" S  Q1 A                printf("count is %d\n", buf.packet_cout);7 M; l4 S- a" v8 N
                count_copy = buf.packet_cout;
# t& F- ]: D/ ~" p* ~. L+ h! N+ F7 g# \        }
7 p0 S8 r3 [$ U$ P2 V9 z$ e2 i& J; O        else
9 f6 Z3 b2 T2 N        {: t% R- l! h  m
                printf("No effective message!");8 d8 O2 z! r* p7 K- ]; r
        }
# A6 G1 r( D+ B) Q0 v1 Z}2 Z* P2 Z' k; u" E

) N, ^1 w: u7 f9 Y, l: G* ~% |" w( N8 Y: a2 B6 d9 |  w, Q
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
( I# c9 ?# z! ?& H1 B0 U% J, q! {使用下面代码,对内存使用了mmap函数后:' ~% L' F& r) o" h
#include <stdio.h>
: b3 E. o4 q, Y2 m. z2 T: G#include <unistd.h>7 M: L4 u$ J0 `$ r
#include <sys/mman.h>
- y$ ]6 v( d3 {0 P#include <sys/types.h>0 Y8 m! [! ]# ~8 _9 h, Z
#include <fcntl.h>
; W, y3 E) }4 v
* }7 E3 _% d. X8 P# R! i#define SHAER_RAM_BASE_ADDR    (0x80000000)
4 P( n2 K+ B' J& y+ e* C  @4 ^#define SHAER_RAM_SIZE         (0x20000)   8 y/ G2 k  w6 n* D

4 a7 y3 h  G# v3 s. Rtypedef struct/ N% a! d) t6 e: M
{
0 F; E& K( M( N        unsigned int a;/ K! m% t0 c5 t1 }; Q
        unsigned int b;
8 Z# |; Y; i% F7 H" m5 G' c7 x        unsigned int packet_cout;
  l$ s: K- b: J( H4 e9 x2 Z2 ~}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) G; @( C9 R, a. k) w
2 @- P" I. C" o2 S; X5 u4 e- M
void read_MSG_buffer(int *baseaddr);
& a& U  [7 n2 ~: \unsigned int count_copy = 0;
9 a8 K$ L5 Y' V! a; y* E
1 S3 T- t+ e0 ~/ i( Tint main()! @& S( R2 O  S! g% f) G& A
{
1 t! ^- B9 ]* ~3 Y        int fd;; z1 }7 i# o- L4 e
        int *mem = NULL;: U7 ?4 n; }4 ^: B; ?
7 F' E" T; M9 l9 S, B* E
        if((fd = open("/dev/mem", O_RDWR)) <0)
2 Z% f: t- ^- ]. B0 z) K* R( c0 H0 w        {0 E; T/ }# F, n# ]: E0 ?! I
                perror("open error");/ |2 O7 J( W/ b5 u9 j
                return -1;# ~" I  y: i9 I+ Z# r8 T
        }( q' J' O' m( r6 K% `1 q
        
8 z, r4 @8 _' g2 ^% p' @" i8 h        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 g* ~: f; I: k0 \) y
2 p( B! e4 r9 |- x0 s
        while(1)3 K- C0 G# r$ m$ U; I4 N# a% S3 O
        {
! l' P1 Q4 x- |                read_MSG_buffer(mem);
* e. s: i- i, Z  A3 P1 {2 W  Q4 n; J        }                ' T" x5 Y- A8 |) Q9 f' r3 P# P
}
8 t2 d: [+ P0 N3 S, L- h9 D$ [
" x8 A) H. f% z& mvoid read_MSG_buffer(int *baseaddr)
" ]; d# p) P" L{9 Q$ B  }# H( l$ R  G
        pRX_MSG_PROTOCOL pshreRAM = NULL;
) `. }" L, Y) {: ~( h. s
/ u4 e4 s( v5 \* C  a9 [        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& o( w0 O1 d' d3 L9 x) i- C5 L8 m& A# J" J1 T
        if(pshreRAM->packet_cout != count_copy): M4 e9 C  h2 F" s
        {
" \4 E0 o6 {6 }* ?/ E                printf("a is %d\n", pshreRAM->a);
* g8 O  V. P; Q6 ~                printf("b is %d\n", pshreRAM->b);
( z8 z0 G% d, b  M1 ]& G                printf("count is %d\n", pshreRAM->packet_cout);+ _6 g6 y7 |3 b5 L7 l
                count_copy = pshreRAM->packet_cout;
# V5 `8 M, |4 ~0 k+ m$ R" m        }. E0 u+ A% ]! V
        else
0 a. A/ ]4 P+ U        {5 g7 d  l) D- w8 o2 G
                printf("No effective message!\n");
+ R, p  U6 O+ s; |6 v+ d$ v        }) v) m4 @+ Z1 E5 x
}% a# {# h- `7 ?

. J7 r. ]3 G6 c$ R8 a  S没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
* T' D0 i" N. j$ B+ x. i! c0 N( h9 r7 x

# S$ `7 o4 y+ h* ^
. [' l% V8 U  Q: Z
7 z4 i; s- ^6 K# K  B) L( b4 ^" s
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-10 10:33 , Processed in 0.048908 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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