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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑
4 \1 \  W& G* z
# v& ?: [9 q* g# v. c( r0 G- Y) zOMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>0 L2 U+ P2 K9 w# q
#include <unistd.h>
2 u0 ~1 h) W( [# F#include <sys/mman.h>
3 n' Z) R" ]8 Q8 R5 [! |3 J. ^' X* F#include <sys/types.h>
. W3 K+ Q3 C% t3 G#include <fcntl.h>
  z& H' A8 l1 U# a* V. C
: X, o' t9 N: O#define SHAER_RAM_BASE_ADDR    (0x80000000)   % G! |$ O: ?9 k6 D

$ e3 F0 L7 v) d( Btypedef struct4 r, d  `: G( E# j3 s9 A4 l
{  U7 L4 M% x) G  q: R
        unsigned int a;8 y$ |2 Q2 ~/ d
        unsigned int b;
' |* o! {; k/ _: Z! N' `- F8 n        unsigned int packet_cout;
( T% S3 R0 U( j, x6 ~- U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
/ `; v) y/ |, z' J8 P: ~" F/ H0 f9 u: s0 y6 S- p1 {$ A
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
' y9 ^/ d* a# t9 W- Munsigned int count_copy = 0;' z' \6 P1 l* F2 {/ q1 ^

0 q, X. `" w5 W9 P( w5 s# E0 v
1 d5 \, T5 w8 B/ K! \: ?int main()4 B  W4 l; f" m+ ?
{
9 J( m; w7 D& V        pRX_MSG_PROTOCOL pshreRAM = NULL;
$ \' B; h: L! d, C        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;9 b* T6 g1 t* E) n* O5 ?0 W1 q

9 u4 r( g: m0 F" o        while(1)2 C& c% G- W6 i+ X$ ^1 m
        {
4 H2 i! j8 R' c' X% J; J                read_MSG_buffer(pshreRAM);# ^' v2 O+ N& i/ d4 t7 ^& S
        }                8 t$ v* J; a4 x0 x! ]
}' t( G. d; F( [7 ?
% D% u5 o( K% j" k. d3 b" E
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)! ]* t1 G+ J* @4 u
{
9 R) _. l# O: L% i# A9 C( E        RX_MSG_PROTOCOL buf;
( @2 Y$ D6 h. l# R) q        9 F% u- Z& @8 P
        buf.a = pshreRAM->a;; A- B' U( A/ W5 B7 ]4 h
        buf.b = pshreRAM->b;
' X# |8 a6 ]6 {% `( a        buf.packet_cout = pshreRAM->packet_cout;
1 s( o. A3 f, M$ q% [8 _( n; g        
3 B) p. E9 q. N$ y        if(buf.packet_cout != count_copy)/ c. U5 o2 V$ J) t
        {0 t, x3 g9 W: k- }% U/ ~+ i
                printf("a is %d\n", buf.a);
( u8 t4 U- C- U3 w% L+ b                printf("b is %d\n", buf.b);3 l9 r! Y5 P0 q0 V7 w) ~- r
                printf("count is %d\n", buf.packet_cout);
+ Y: @( h1 h) W: p: S; f* Z4 i1 J                count_copy = buf.packet_cout;. P: Y: o9 A7 Q) ~3 \3 u
        }9 C0 g( A2 m+ v2 ?& z! ?- P+ W9 i& R
        else5 M( m5 a! z/ `# H& d4 W( c
        {
6 o7 p' ~3 h( s6 }8 j. O- e8 }4 v                printf("No effective message!");( E8 Y* x+ q5 D; o- S! R
        }% w& }  L* L% X7 V
}+ }4 y- o% q# q5 {0 L

) @/ o- o) K, h6 V5 Q! s# m  o+ s- ?2 A" B4 E
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。' {. Q" F1 h# L; z' H
使用下面代码,对内存使用了mmap函数后:- o! h4 I1 {1 J0 a  B2 i
#include <stdio.h>. z# l4 z* n+ B4 B; I1 s' }. j6 C
#include <unistd.h>1 K$ Y2 x9 U+ t* @% _- x# T3 O
#include <sys/mman.h>
/ o% ^. |( H+ I+ U/ {3 C" u#include <sys/types.h>1 C7 K" I7 a5 d3 ^+ \
#include <fcntl.h>0 m* A1 B: d' g# t( H# I4 v

1 Z9 x9 L/ ^0 T1 J) k3 R#define SHAER_RAM_BASE_ADDR    (0x80000000)5 R+ d7 Y  S0 q7 a; ]
#define SHAER_RAM_SIZE         (0x20000)   * o' x; H3 v: c4 z. `  @

+ Q1 v" B, ~7 Wtypedef struct
" D1 v: e; F& }' w+ l$ T{
+ O/ Y( C6 B/ L3 f1 P* ^3 l        unsigned int a;
3 s# G" D6 ^6 n        unsigned int b;. V) y5 J  P% ~3 z5 g& S* j
        unsigned int packet_cout;
  T# U+ P3 f! F+ @3 @}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;7 u& h- I. x( _; ]- \( ^3 M
0 j8 [+ [% ?' e2 r, X3 W
void read_MSG_buffer(int *baseaddr);% f8 M- V4 p) g0 [# M7 q5 ~" [( m
unsigned int count_copy = 0;
& D7 P+ a. ]! j5 e7 D+ T0 w0 t) @
int main()) {( Q$ [* S4 B: f& a! r
{
. T6 L! C# H' _" ]        int fd;
; x; \; Y2 z8 i" R; C: r* x# P  l( |        int *mem = NULL;, Z; w% C* v/ }8 a" l5 Z/ {1 P
% n; P4 d9 O4 v' h' I- A% b8 G
        if((fd = open("/dev/mem", O_RDWR)) <0)0 w7 F, n0 b& d2 c4 s9 u9 _
        {
1 D& k  R8 ^% S0 ?                perror("open error");7 }' h# c/ Z) ~2 Y
                return -1;/ P' _+ \2 _5 H6 k
        }
5 t3 D) {- a& r        
( b: e) c9 d9 K% Z$ O' b        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);' r/ b7 C$ y1 Y
" P8 p5 c8 I0 I5 o8 @8 s: Z2 Q
        while(1)
) p1 ~- s. U' {/ }8 O        {
' H" d+ f$ B/ h                read_MSG_buffer(mem);
# D7 j4 E3 D4 J* T9 v. M        }               
& [* k* G1 x! G, X}
* w& T* T8 J) R- T+ Z- _
  [0 w) Z8 @& a, |void read_MSG_buffer(int *baseaddr); r9 ?& v& Z' K9 U7 K+ R/ B1 w- i- J
{
2 b% }  v4 [" N& F5 p        pRX_MSG_PROTOCOL pshreRAM = NULL;
) Q* f, y4 K) n: i! W. k7 ^
3 E' }8 w# X: ~! |        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;4 e% H. o5 \6 i) R

# J) X5 g8 i2 Z# r0 t8 f% ^* M# O        if(pshreRAM->packet_cout != count_copy)9 X" H" U) a4 E$ d
        {
1 l) V% d* o/ s! p) L3 q                printf("a is %d\n", pshreRAM->a);3 L6 }0 X5 B% P2 L# C
                printf("b is %d\n", pshreRAM->b);
8 s/ O, a6 g% k1 J                printf("count is %d\n", pshreRAM->packet_cout);
( Z' A4 x& X* I6 e9 `' d' u                count_copy = pshreRAM->packet_cout;( I9 I* [& ^* H0 a1 p# a
        }8 L/ ~2 W/ h  t
        else  N0 H2 G* k0 D3 z" \$ ~+ U
        {! e0 U3 F4 q. l. g& {2 E
                printf("No effective message!\n");0 u* c6 f4 n" [3 C3 d! O9 H
        }
; q% J# E/ i) I! J}  ]/ }4 h( I6 |/ @# I
/ C2 t0 H" Q! c7 ?* L6 g# P% O! o
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???4 R. X+ o8 `& l; ~
3 a- K' {( j' e  F

( n0 j: c4 u4 |+ h9 U$ ?+ E/ W  k* f3 a/ d: i
" d7 x$ Z" W# g: [% ]: h" U. R
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 02:02 , Processed in 0.061760 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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