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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 - ~7 @, o5 Z0 p. A! H# O) B

" \" b4 X* Y  wOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
* D5 C# t' @, a, R7 K! |  [#include <unistd.h>
7 f& U# ~5 H! [9 H* y6 y#include <sys/mman.h>
1 r/ Q  z1 E( m7 P; p#include <sys/types.h>) T4 G; |, k4 t
#include <fcntl.h>2 r0 [* w& U6 S4 \- f6 d  t7 e4 w
1 f5 }2 P2 w+ T
#define SHAER_RAM_BASE_ADDR    (0x80000000)   
- x2 g3 V7 }$ ^* d) x, r
# d# m/ k1 h" i5 |8 s4 atypedef struct9 f! o; s7 m$ @* c
{2 Q8 l' z4 P/ z. N$ d6 ?
        unsigned int a;9 i9 \1 z' d9 r
        unsigned int b;
: k5 g2 W1 F. T' W4 p  U! u        unsigned int packet_cout;1 p; _( o$ H( M2 y  y) o. J( G
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
2 w1 h+ s& r' @) l; x: ?8 p1 A( i- `& {( u- r- F8 z4 H  p7 j
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
1 i5 |& r; ]: c; runsigned int count_copy = 0;
7 M( i+ D9 M' G+ Q0 o& ]) O" F! L; `% {  [8 v4 z* L8 n( \
2 B- l  e% B( c% [% S5 `
int main(): y# h2 i4 P4 e; I. I  O
{" i. e) R, E, A6 `
        pRX_MSG_PROTOCOL pshreRAM = NULL;
" D2 _9 L9 Q- Z( J        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;; h& \: ~( i5 l6 L& A" M
) F* ?: J3 F/ X  X1 O
        while(1)# f: v" K6 {5 S( G0 C$ Q' p
        {$ c0 }7 m+ }# W6 |& ]2 `
                read_MSG_buffer(pshreRAM);
, ^6 W8 l2 ]$ m: \        }                , L# [3 o: B7 T- c" b7 l. m
}
( g6 F5 s( p% g6 J8 Q) m' H# G8 s. K, o4 ?7 W
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)% E) t7 M/ x/ |5 K+ {
{0 R  d$ M/ _) m; A
        RX_MSG_PROTOCOL buf;1 \+ `/ M0 f) R& p7 j: C! h) w
        ' ^2 E! I9 Q6 J
        buf.a = pshreRAM->a;& s' W8 [0 B2 x: t) n
        buf.b = pshreRAM->b;
$ }3 k# H7 I' B* [( ~        buf.packet_cout = pshreRAM->packet_cout;4 g; ]" ?8 ], q# ]! g) o
        
) }; P/ q& y( O1 e! c8 D9 h4 l* t: E4 b        if(buf.packet_cout != count_copy)2 k- j4 ^( ^& R; f4 {! x( i8 m
        {' y5 l  u: S6 l( d
                printf("a is %d\n", buf.a);
" f6 |8 a, H  Q9 |                printf("b is %d\n", buf.b);: m( _' p& m; d1 l) i9 B
                printf("count is %d\n", buf.packet_cout);+ s' j9 D3 R; ~% F4 J
                count_copy = buf.packet_cout;
! p9 I7 Z4 e6 v        }1 [2 M1 a4 `7 Q' _6 I
        else
( i, q, i4 n6 d        {
6 |/ H3 B6 Y4 G4 J$ @. y+ e                printf("No effective message!");
6 j) z/ c$ Y. p& c1 O0 C        }& C7 Y# G9 H/ L
}: |6 h& \5 U/ h) R& `  e
5 J5 V: Z3 H2 t: E  B0 `
% c  c2 Z) N* y7 `/ m
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 E/ s% u8 c3 C' d1 D* Y使用下面代码,对内存使用了mmap函数后:2 L5 T3 a5 K+ P/ i' g* _* I! g
#include <stdio.h>$ k3 \( W' `) h. m, o8 d: Y; F
#include <unistd.h>' B2 g5 j- |& r$ i& Z/ i; i
#include <sys/mman.h>% u8 \& m0 }3 e: {9 u5 U
#include <sys/types.h>
* F' b9 y; C: I) Z#include <fcntl.h>7 T: \0 ]( g7 f

# b3 ~0 Q# C: x! }% Q$ l1 B, J. J! [#define SHAER_RAM_BASE_ADDR    (0x80000000)
* |3 v6 |- o  o( D$ L0 b#define SHAER_RAM_SIZE         (0x20000)   
( v8 ]+ u2 j' x/ A+ `
; G5 ^, z% C* c# @% H7 ]# g+ Jtypedef struct
% t0 k3 i# Z0 o3 X3 Z, d{
+ N9 Z  u0 E% L3 ~        unsigned int a;
8 R3 i4 t+ e+ o  p        unsigned int b;8 p2 s. E% q# }, {& `! H/ S
        unsigned int packet_cout;
9 z  }- z8 S; ^5 D}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
% |' g7 S* @# o  ]; @( s3 J% ~' v, \7 E0 w. V
void read_MSG_buffer(int *baseaddr);
/ ]5 Q9 B( b$ v* m0 Uunsigned int count_copy = 0;. O6 f) Q6 E% Q) {; q! c
2 ]. B" [- ~# Y5 [
int main(). u* O" T& g( [% v5 q. a# k7 f
{
: a& x* ~" t" F. {) O        int fd;; l/ W3 x8 U- C  T9 h% }0 H% S  L
        int *mem = NULL;
# l0 r4 k8 l, k: F& Z: u: n4 V( ?8 M% }) ~8 y! W" W& ?
        if((fd = open("/dev/mem", O_RDWR)) <0)  H" Z5 C! ^# I5 L( \5 u
        {
& q1 y# k. d9 b" q! C+ Z: z                perror("open error");
. ?% x4 i) w& X- r, C! H5 u                return -1;
/ Q/ n% E8 b" t' o        }/ h/ v  R7 z! G5 D3 c
        : t4 \" F) D/ |# Y, |, Q% G. j
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
+ a9 T  Q  _: w) L5 c+ M8 Z! i* a6 a: W- Z0 |; P
        while(1)
' e3 {3 n1 A6 ]8 O) B        {9 q9 {) p3 e8 c4 d! x
                read_MSG_buffer(mem);
! j, A5 a$ Z7 I        }               
  N; ]4 k. q7 X8 p1 S% b5 ~}
9 ~' g6 i% g7 u' J6 w4 r
7 p( z/ ], K' C4 S: |void read_MSG_buffer(int *baseaddr)
7 p4 J! d1 N5 p3 Z{
$ X4 K( C' {. [; Y) h! g' w1 F        pRX_MSG_PROTOCOL pshreRAM = NULL;
; l' b3 i  Y1 W' [$ |" L7 E
1 S) U6 L/ i9 j1 Q# m( t* l" ]        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;& f$ S. b2 O0 C" v; _

9 V+ z7 E% D2 x8 r1 G        if(pshreRAM->packet_cout != count_copy)
* H. N3 I8 U" `: v0 P        {5 ?% c: P0 @8 t" W- L0 D6 S
                printf("a is %d\n", pshreRAM->a);( L( A; d8 n7 ^( b2 N5 x
                printf("b is %d\n", pshreRAM->b);! g2 M5 z0 n; R- ~& x
                printf("count is %d\n", pshreRAM->packet_cout);
# h0 d4 Y2 p% M5 i4 g9 T9 |                count_copy = pshreRAM->packet_cout;- Z8 O+ V  C' j5 D" i
        }
4 C+ O  U1 j$ _0 X        else
: ^/ J7 J& E  c9 }1 t        {) B+ J% Q  B0 u/ [$ Q' }
                printf("No effective message!\n");0 L' C& Y7 }9 W7 b+ U0 K
        }
( D0 |$ ~6 c( O- J}
5 b% `' _! H  k) k" h3 g$ h( h/ M/ `" F3 s
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???7 N7 a) Z: z! s8 }
3 X! u  s  W6 a9 D0 [* e

3 _# i4 j; r# R6 t2 i- h3 u
& S8 p+ y( U3 h6 Z) Y4 k' R& \6 p' u# J" w  ~3 e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-16 23:15 , Processed in 0.040342 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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