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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]

5

主题

6

帖子

51

积分

注册会员

Rank: 2

积分
51
跳转到指定楼层
楼主
发表于 2014-8-19 16:38:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 zc_fly 于 2014-8-19 16:53 编辑 : ]: o3 C  t) S% \3 k
& }$ S: k9 r+ g+ r( n$ q. `) @
OMAPL138的ARM端对共享区内存进行直接访问,代码如下所示:#include <stdio.h>
8 r* s# ]5 P# T; {: V#include <unistd.h>+ R% @, k3 z; j1 S% ?
#include <sys/mman.h>; M: A4 f  k0 b# R) k+ b/ m
#include <sys/types.h>
* \# A4 e/ v; @, U. V# j% J#include <fcntl.h>
# l& R# m4 n, e. \7 E6 W
( ~5 N/ _1 k4 c  [( ^# O#define SHAER_RAM_BASE_ADDR    (0x80000000)   
% n5 z! n/ X6 D; c+ X$ b. ?$ I6 P2 G; d0 O% g4 _
typedef struct3 S; |0 f$ A* [  x
{
& e7 ?7 S+ c3 x& T        unsigned int a;
% |; H; S" C, W4 D- J  P2 f: Y3 b6 K        unsigned int b;- w6 f4 @  M# R+ j$ [9 D/ D
        unsigned int packet_cout;
6 x  i: C( @+ g# c$ m: A- U}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;6 r/ a: R% R& ^- I; u% t
+ b1 [/ V* M& ^$ ^+ K  H' O
void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM);( e9 o0 v9 S% N9 F
unsigned int count_copy = 0;9 Z4 C, i! F) L+ a; v2 }6 X* W

9 Y7 }8 Y) ~8 Z9 N# J- S" l" I3 a! ?0 s+ J2 |# ]! d
int main()
! d$ b5 C1 x1 P% n+ g) f% P{  P& ~4 k0 ]' R& j
        pRX_MSG_PROTOCOL pshreRAM = NULL;( N  z) F& j" q  v
        pshreRAM = (pRX_MSG_PROTOCOL)SHAER_RAM_BASE_ADDR;
0 {7 u( \1 m! ]& E& z$ |6 x
* i' S- m$ z2 C; I0 A6 D: ]        while(1)) c8 V8 ~( H: q; w
        {
: z6 m: |  |2 x; O                read_MSG_buffer(pshreRAM);. ~7 H3 l6 ]* i* C/ x) R
        }               
+ o0 u' Q# S6 M. `6 A; t}- X' B& e% _" f7 {

% T7 N' g5 [, q7 @void read_MSG_buffer(pRX_MSG_PROTOCOL pshreRAM)
3 m3 @5 i9 c0 o' s5 d) T/ x; u{
. D- X( u" }2 {' v8 t: E        RX_MSG_PROTOCOL buf;
/ M, S  j2 F8 j3 O7 h" S        ( ]7 U  ?4 F: Y
        buf.a = pshreRAM->a;
% `4 T* t0 h) q2 j! G! d$ M8 v        buf.b = pshreRAM->b;
+ u9 g# u# |2 }" |. e        buf.packet_cout = pshreRAM->packet_cout;# Q9 \0 U/ O# A  ^/ ?" r5 l
        * i( Q! h% W& C, K9 y/ ^9 A! s! \
        if(buf.packet_cout != count_copy)
" w, }- U& n, O9 s# m) N        {" {/ M6 D4 \, R& \: V! @9 k
                printf("a is %d\n", buf.a);+ o& R& H+ S" C. w5 \% z( X8 ~$ W
                printf("b is %d\n", buf.b);
5 L. U$ ?* y, C7 k) g2 ^                printf("count is %d\n", buf.packet_cout);
( U# O$ L/ X4 ^  q, `1 }/ |6 Z                count_copy = buf.packet_cout;' R, W7 H. \; P% _: a
        }3 Z( i9 z4 Y8 j( v( [
        else
8 z) A, a% N0 |0 K; q- W; ~7 A        {) n6 C# }/ g0 d+ V6 ]/ F
                printf("No effective message!");
3 {# U3 n* W0 B$ u9 W2 j8 D7 n        }, }9 G9 `: o% X6 v8 H7 l
}
  b9 W) I! S3 C5 [& L9 n* f4 Y3 C" x: O, @; A
5 X% N6 ?  l" F- C4 s7 I' D
但是出现segmentation fault的问题,这是什么原因啊???我在DSP端烧写了一段小程序,向共享区0x80000000位置写入数据,用CCS 测试发现写入成功。
" ], Y. L' Q5 x* x9 l使用下面代码,对内存使用了mmap函数后:
' Y( z3 j8 j- K#include <stdio.h>
# M, ?4 P1 w+ P9 o8 V3 X#include <unistd.h>
$ u( T" o' \) B" |#include <sys/mman.h>
4 n$ V' A8 j2 v* w' o#include <sys/types.h>& s5 ^* g7 d# j  s$ ~9 `
#include <fcntl.h>& ?  Z$ x3 L$ c) E, t9 R: @
! ]3 R& x/ r# T2 u) u. j
#define SHAER_RAM_BASE_ADDR    (0x80000000)( N* c/ s* \' k) m+ R: F2 D; l; e
#define SHAER_RAM_SIZE         (0x20000)   
0 e# @# {$ F# V* X- |* X2 Q
3 m" f0 p" m3 H0 R" u# Ftypedef struct* A8 Z3 d# P2 X- r( I8 G* L2 ~9 V
{4 I$ f" {$ t& f* h& L
        unsigned int a;+ @! R9 b' q, P1 T" G
        unsigned int b;
6 ~  m! `: B& m        unsigned int packet_cout;) Z. P2 q2 |( S0 @
}RX_MSG_PROTOCOL, *pRX_MSG_PROTOCOL;) l  G  ^$ A3 G- L; L4 B

9 t" I2 N# f1 u( _( ~* e! rvoid read_MSG_buffer(int *baseaddr);
/ [4 X3 B2 Q" e& c5 u5 t% eunsigned int count_copy = 0;
" M, W' U) V! `- S. ]& G
' S  a6 \8 V. R+ ~  i' O3 R) Zint main()6 ^" d, p9 N; f! [2 C
{
* P5 u' K1 T* y% G/ v! f2 z5 O        int fd;+ o: z5 o" m0 r' F! l) X4 S
        int *mem = NULL;
( u2 ^3 y. ~  s+ }9 u% {0 j! z6 `* w; t, \5 a8 c. u
        if((fd = open("/dev/mem", O_RDWR)) <0)# m4 ?7 i  e( W9 _) M8 a! J
        {" X0 |; @3 Z: G8 Y* X$ l% i- n
                perror("open error");
& |. N' N  N/ q+ c8 b1 e                return -1;
- ]8 a6 f- @" \* n        }
- j* k# s( H  \        
* y% w) M( j& y' F        mem = mmap((void *)SHAER_RAM_BASE_ADDR, SHAER_RAM_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);6 B2 J& X- V4 \: L

2 q8 \* Y* H5 E+ g9 b6 i        while(1); k: W% d# t3 }1 m! }5 {
        {
! ]! y( q6 y7 |                read_MSG_buffer(mem);+ l- c# \9 \) b& ?# l7 a- X
        }               
9 x; k5 i+ ]/ @- Y}
$ g. ?, Y2 s$ b. x. k3 J6 E9 Z) z. F. B6 ]( j9 ?% g' L
void read_MSG_buffer(int *baseaddr)
) S" w- S) q  K{
2 X7 A& B# q: |+ l) o( f% A6 P        pRX_MSG_PROTOCOL pshreRAM = NULL;
' {% ~6 ?9 U4 q1 z. z* }- Z' [# T9 f2 `# @
        pshreRAM = (pRX_MSG_PROTOCOL)baseaddr;
& v' D0 D# v5 G
0 C. t* R1 X; O4 N% Y+ x) Q        if(pshreRAM->packet_cout != count_copy)5 G5 }  E/ H( O7 S* K, N0 B4 ~0 z
        {: [. {3 Y! @; t! e/ `
                printf("a is %d\n", pshreRAM->a);8 f. i( w9 c# Y* m0 Z# _, a& T4 w
                printf("b is %d\n", pshreRAM->b);
( G, O0 K: [, i0 l9 N7 q& j                printf("count is %d\n", pshreRAM->packet_cout);2 s) h! `# R2 C" l, P# K( Q
                count_copy = pshreRAM->packet_cout;4 Y2 q" m  K6 F& v
        }
- T9 Z  H5 X! ?( ]4 g, O        else; p, T1 I2 F. `! I" j. ^. h
        {
7 I4 i0 {4 ~3 v9 V7 o                printf("No effective message!\n");" V, R& f# O2 ~, }4 I- k- R
        }8 h2 `' N# G. ~
}
% k" k6 ]+ }2 B+ e4 Y2 c* O2 f. }
没有出现segmentation fault这个错误,但是读出来的数据均为0。这该怎样解决啊???主要问题还是在Linux系统下,OMAPL138是否可以直接访问映射地址???该怎样实现???
. d- b" e2 ?7 |: e0 z3 ?+ d  O+ L* m2 }, A% g, [0 V

% i) F( o' `8 {1 _; Q
4 {- J$ W3 a- c5 y9 Y1 x9 h- }0 w- b: H9 i# m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-7 11:57 , Processed in 0.042405 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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