OMAPL138的内存映射是否在Linux下已经完成??? - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 + ?! o3 S- Y2 L. h5 `9 l, r3 S
4 R- ~; Z! u( i4 y& I# L) D; @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>  t9 A- N7 ^4 I
#include <unistd.h>
5 b# _6 W* A' k3 R8 |1 N% g#include <sys/mman.h>  P/ p3 S% u  I1 T, @; A% b
#include <sys/types.h>3 c+ Z( g5 D- |& G
#include <fcntl.h>
2 o7 b' S/ \+ |9 `% f$ }9 P6 I; s6 L3 U
#define SHAER_RAM_BASE_ADDR    (0x80000000)   $ `9 a' V+ z* g/ v6 n
7 J  z* b6 I( t% R7 k3 x
typedef struct+ \6 k7 }6 E$ M6 G. M
{1 W  L- \4 z# K5 [
        unsigned int a;& s# [6 B+ x2 _; K1 F) \7 s$ o& x
        unsigned int b;1 w% x2 K: ~9 ~( _
        unsigned int packet_cout;$ g3 ?$ R+ g1 T3 j8 K+ G3 h
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;0 l1 M( U9 j+ G" K

0 E9 J) ~2 S' B+ L" L! Bvoid read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);
5 t& U8 a+ g% J( s' M9 J: M9 [unsigned int count_copy = 0;
" V5 x7 w: X+ ]% R
0 x# J/ Y  h3 W0 t  h; y# p, v4 V3 n% G
int main()
9 ~: _( V5 d; O0 S$ o- J, i! |{
7 e( I; I* k  B- u% B# C        pRX_MSG_PROTOCOL pshreRAM = NULL;
& d9 J5 \% |$ e1 i6 c& Z8 ]" Y9 ^        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
, T" D' C2 J1 |( a" U0 X7 Q# S# B: j* B7 ]; i3 c) @
        while(1)6 B6 t7 W# r: w( j
        {
3 N7 |. I& e! q! R0 W                read_MSG_buffer(pshreRAM);1 q( ^' x+ w1 j7 ^$ j" b0 S
        }                5 T/ p  C+ f- G) C, ^
}
" Z' u/ f; h' V* D) r. J' r* E- b% q& h: i% t6 h3 M1 [
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
! F* i# f/ W+ c{# F7 x1 B( L) O' A
        RX_MSG_PROTOCOL buf;
) ^! t; ]% C* |6 a2 K3 b' O        
' R) a$ w+ S, O3 c5 ?2 v        buf.a = pshreRAM->a;) \7 q* _& P  G! n  _! Y5 y/ W
        buf.b = pshreRAM->b;
. X4 j* g! F4 T2 n        buf.packet_cout = pshreRAM->packet_cout;
4 z9 A* w8 O) j' ?5 j' s9 m        ! }* Q2 ]# z8 `' ]9 u
        if(buf.packet_cout != count_copy)
+ q7 k& u! Y; g$ K" b& s: q        {
7 l& D; v: G5 T# _1 t6 J* ^                printf("a is %d\n", buf.a);2 k; L' O" S- B% Q
                printf("b is %d\n", buf.b);( g: `; f  Y0 [5 U
                printf("count is %d\n", buf.packet_cout);4 ]; s1 t; C' A' S. z4 P
                count_copy = buf.packet_cout;0 [2 O& \- u% E1 L% A5 H3 a' P
        }6 U$ f# A9 @1 s6 I
        else
5 D0 [9 a8 Q1 m3 ?  b        {
9 P0 t9 O8 _  }: C% e                printf("No effective message!");# M9 D2 ?  n- w
        }
* P" a) j5 {8 n; P+ Q2 a! O}
( W" F# g1 S& Q1 q# }# d5 C  a* {4 I2 [7 n' t1 v

" j2 k7 z% `2 C$ }. s% `但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
5 v8 V* W. k/ S  ^使用下面代码,对内存使用了mmap函数后:
# G" N* ?8 k8 K( v* g9 n  M% j#include <stdio.h>
( w, j$ A8 l9 G- a- d$ B. k#include <unistd.h>
' E" Q  I- Z7 c2 N#include <sys/mman.h>0 }% K* o  Y  c( f# S
#include <sys/types.h>
9 X* o% C, E  l: x! q#include <fcntl.h>
5 w- I# A. Q$ s/ c4 B0 Y. K, f5 I$ g3 h  x7 Z! K( _
#define SHAER_RAM_BASE_ADDR    (0x80000000)
+ E; ]3 _3 `; F; Z#define SHAER_RAM_SIZE         (0x20000)   
+ N( ^7 \1 Q' j4 S# H% S2 i  x
; |5 p: ^, T( h( B& i( }typedef struct
5 L7 b/ a) T% r{
2 |& a: r; h  d& [( ~) z        unsigned int a;4 z, t$ P  T% l7 D4 O7 h
        unsigned int b;
/ }( \3 O/ k0 l% u4 o; I+ D        unsigned int packet_cout;
1 a' e  _3 Q7 Z  p: F, p- A) L}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;
3 C9 I8 [# ]0 y6 e- h% L) r) L% |" L& H( G+ P' i' o
void read_MSG_buffer(int *baseaddr);
9 t8 S2 a3 s9 Q, Lunsigned int count_copy = 0;
- V. l. r& ?# i+ P' W6 Q
" _; Q% k5 j2 ~, P% B! _6 [int main()( @  }. n3 q" Z1 r! I
{
" c3 n5 u) A' ~# F/ T, Y        int fd;
1 @; p" K7 ]/ N) i) n1 ^+ t$ h        int *mem = NULL;
4 E7 T; c9 R4 M; M( U$ w# Y* b1 A: D1 |4 E8 s
        if((fd = open("/dev/mem", O_RDWR)) <0)
  W$ A" V. u, O" z        {! L3 R: U  V8 x2 W* x& G3 Y
                perror("open error");
' o$ W6 m0 T' K5 ^* K2 W& d' o                return -1;" M6 R# a) }# g' Y* i) ~$ E1 Y
        }
, t! K/ P# @) w8 o        4 @# ?3 L/ W, m5 w( F$ E( E
        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);$ L* R& D8 t- j9 D8 z" n% Z4 a
& a/ F( z9 R" }' Y, s. E) j
        while(1)* X5 y: T" j+ {8 F$ M% n: e  C: X
        {
5 h+ X! H$ D% k! ]                read_MSG_buffer(mem);6 _* I, w. \) v( i: W8 U/ ^
        }               
  e3 x  C+ [) {# M4 i- y}1 }5 E6 z) |( I$ X$ X) U5 Z3 M
1 m9 E( Z7 Y: `6 E9 h8 V9 w2 k
void read_MSG_buffer(int *baseaddr)
/ R* r* o" O" v2 D) b/ E- q{
, R: J6 s% Y6 ^- C6 P, w        pRX_MSG_PROTOCOL pshreRAM = NULL;  f+ F" [0 d' S6 K" ?% Z

: E( J: Q9 B- [# c        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
  d0 T( e7 T. }
. N8 M" }9 t# e2 D1 }! W/ k        if(pshreRAM->packet_cout != count_copy)
7 Y: G+ C6 z0 e0 B, G3 L3 M        {
3 M3 }# Q( W3 z7 B  s5 [3 q                printf("a is %d\n", pshreRAM->a);; t8 w! ]+ n: ?
                printf("b is %d\n", pshreRAM->b);" I9 u0 o- k( \- Z9 u# _8 F
                printf("count is %d\n", pshreRAM->packet_cout);! E" y+ G/ Z) q6 V' \, T
                count_copy = pshreRAM->packet_cout;
5 u2 p( f" Z5 l7 E: s        }' C+ ]( k- P3 X4 \% ^1 w; U
        else
- G- s* N9 h8 O) ], r3 @        {9 A3 \) p; P: h: T4 i8 f* U
                printf("No effective message!\n");
$ K+ \; p; s7 k* S; k        }; }* G- R! A) U: E
}
& V5 u) [2 D0 O5 M, {5 M9 F# T! y4 V7 t
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
/ ~) h( p- ~  T  L4 m  t4 u* h, b4 T* v- R/ ?

# |; C- G" \3 a( k% Z) B7 P# W8 Z: Q$ d
  l2 B* P* W* \( I+ w
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-5 14:13 , Processed in 0.036838 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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